Provided by: manpages-de-dev_2.5-1_all bug

BEZEICHNUNG

       mlock, mlock2, munlock, mlockall, munlockall - Speicher ver- und entriegeln

ÜBERSICHT

       #include <sys/mman.h>

       int mlock(const void *addr, size_t len);
       int mlock2(const void *addr, size_t len, int flags);
       int munlock(const void *addr, size_t len);

       int mlockall(int flags);
       int munlockall(void);

BESCHREIBUNG

       mlock(),  mlock2()  und mlockall() verriegeln den gesamten oder einen Teil des virtuellen Adressraums des
       aufrufenden Prozesses  im  RAM  und  verhindern,  dass  der  Speicherinhalt  in  den  Auslagerungsbereich
       ausgelagert wird.

       munlock() und munlockall () führen die umgekehrte Operation durch bzw. entriegeln den gesamten oder einen
       Teil des virtuellen Adressraums des aufrufenden Prozesses, sodass die Seiten  im  angegebenen  virtuellen
       Adressbereich wieder ausgelagert werden können, wenn das von der Kernel-Speicherverwaltung verlangt wird.

       Ver- und Entriegelung des Speichers werden für ganze Speicherseiten durchgeführt.

   mlock(), mlock2() und munlock()
       mlock()  verriegelt  Seiten im Adressbereich, der bei addr beginnt und sich über len Byte erstreckt. Alle
       Seiten, die einen Teil des angegebenen Adressbereichs  enthalten,  verbleiben  nach  einem  erfolgreichen
       Aufruf garantiert im RAM; die Seiten bleiben garantiert im RAM, bis sie wieder entriegelt werden.

       mlock2()  verriegelt auch Seiten im Adressbereich, der bei addr beginnt und sich über len Byte erstreckt.
       Der Status der Seiten, die einen Teil des angegebenen Adressbereichs enthalten, nach einem  erfolgreichen
       Aufruf hängt vom Wert des flags-Arguments ab.

       Das Argument flags kann entweder 0 oder eine der folgenden Konstanten sein:

       MLOCK_ONFAULT
              Lock pages that are currently resident and mark the entire range so that the remaining nonresident
              pages locked when they are populated by a page fault.

       Wenn flags 0 ist, verhält sich mlock2() genau so wie mlock().

       munlock() entriegelt Seiten im Adressbereich, der mit addr beginnt und sich über len Byte erstreckt. Nach
       diesem  Aufruf  können  alle Seiten, die einen Teil des angegebenen Speicherbereichs umfassen, erneut vom
       Kernel in externen Auslagerungsspeicher ausgelagert werden.

   mlockall() und munlockall()
       mlockall() sperrt das Paging für alle Seiten, die in den Adressraum des aufrufenden Prozesses eingebunden
       sind.  Dieses  bezieht  sich auf die Seiten von Code-, Daten- und Stacksegment genauso wie auf gemeinsame
       Bibliotheken, Kernel-Daten im Userspace, Shared Memory und auf den Speicher abgebildete Dateien. Es  wird
       garantiert,  dass  alle  eingebundenen  Speicherseiten  im  RAM  bleiben,  wenn der Aufruf von mlockall()
       erfolgreich beendet wird. Es wird darüber hinaus garantiert, dass die Seiten solange im RAM bleiben,  bis
       sie wieder entriegelt werden.

       Das  Argument  flags  wird  mittels  logischem  ODER  aus  einer  oder  mehreren der folgenden Konstanten
       konstruiert:

       MCL_CURRENT sperrt alle Seiten, die momentan in den Adressraum des Prozesses eingeblendet sind.

       MCL_FUTURE  sperrt alle Seiten, die in Zukunft in den Adressraum des Prozesses eingeblendet  werden.  Das
                   könnten zum Beispiel neue Adress-Seiten sein, die bei einem sich vergrößernden Heap und Stack
                   benötigt werden, Dateien, die in den Speicher eingeblendet werden,  oder  gemeinsam  benutzte
                   Speicherbereiche.

       MCL_ONFAULT (seit Linux 4.4)
                   Used  together with MCL_CURRENT, MCL_FUTURE, or both. Mark all current (with MCL_CURRENT)  or
                   future (with MCL_FUTURE)  mappings to lock pages when they are faulted  in.  When  used  with
                   MCL_CURRENT,  all  present  pages  are  locked, but mlockall()  will not fault in non-present
                   pages. When used with MCL_FUTURE, all future mappings will be marked to lock pages when  they
                   are  faulted  in,  but  they  will  not be populated by the lock when the mapping is created.
                   MCL_ONFAULT must be used with either MCL_CURRENT or MCL_FUTURE or both.

       Falls MCL_FUTURE angegeben wurde, kann ein späterer Systemaufruf (z. B.  mmap(2),  sbrk(2),  malloc  (3))
       fehlschlagen,  wenn  durch ihn die Zahl gesperrter Bytes das zulässige Maximum überschreiten würde (siehe
       unten). Unter den gleichen Voraussetzungen kann eine Vergrößerung des Stacks ebenfalls fehlschlagen:  der
       Kernel wird den Stack-Ausbau verweigern und dem Prozess ein SIGSEGV-Signal schicken.

       munlockall() entriegelt alle in den Addressraum des aufrufenden Prozesses eingeblendeten Seiten.

RÜCKGABEWERT

       Bei Erfolg geben diese Systemaufrufe 0 zurück. Bei einem Fehler wird -1 zurückgegeben, errno entsprechend
       gesetzt und keine Änderungen an den Sperren im Adressraum des Prozesses durchgeführt.

FEHLER

       ENOMEM (Linux 2.6.9 und später) Der Aufrufende  hatte  eine  weiche  Ressourcenbegrenzung  RLIMIT_MEMLOCK
              ungleich  null,  versuchte aber über diese Grenze hinaus Speicher zu verriegeln. Diese Grenze wird
              nicht erzwungen, wenn der Prozess privilegiert ist (CAP_IPC_LOCK).

       ENOMEM (Linux 2.4 und früher)  Der  aufrufende  Prozess  versuchte  mehr  als  die  Hälfte  des  RAMs  zu
              verriegeln.

       EPERM  Der  Aufrufende ist nicht privilegiert, benötigt aber zur Durchführung der angeforderten Operation
              Privilegien (CAP_IPC_LOCK).

       Für mlock(), mlock2() und munlock():

       EAGAIN Ein Teil des angegebenen Adressbereichs oder der gesamte Adressbereich  konnten  nicht  verriegelt
              werden.

       EINVAL Das  Ergebnis  der  Addition addr+len war kleiner als addr (z. B. kann die Addition einen Überlauf
              verursacht haben.)

       EINVAL (Nicht unter Linux) addr war kein Vielfaches der Seitengröße.

       ENOMEM Ein Teil des angegebenen Adressbereichs  entspricht  nicht  Seiten,  die  in  den  Adressraum  des
              Prozesses eingeblendet sind.

       ENOMEM Locking  or  unlocking  a  region  would  result  in  the  total  number of mappings with distinct
              attributes (e.g., locked versus unlocked)  exceeding the allowed maximum. (For example,  unlocking
              a  range  in  the  middle of a currently locked mapping would result in three mappings: two locked
              mappings at each end and an unlocked mapping in the middle.)

       Für mlock2():

       EINVAL Es wurden unbekannte Flags angegeben.

       Für mlockall():

       EINVAL Es wurden entweder unbekannte flags angegeben, oder MCL_ONFAULT wurde weder  mit  MCL_FUTURE  noch
              mit MCL_CURRENT angegeben.

       Für munlockall():

       EPERM  (Linux 2.6.8 und früher) Der Aufrufende war nicht privilegiert (CAP_IPC_LOCK).

VERSIONEN

       mlock2() ist seit Linux 4.4 verfügbar. Glibc-Unterstützung wurde in Version 2.27 hinzugefügt.

KONFORM ZU

       POSIX.1-2001, POSIX.1-2008, SVr4.

       mlock2 () ist Linux-spezifisch.

VERFÜGBARKEIT

       Auf  POSIX-Systemen,  auf  denen  mlock()  und  munlock()  verfügbar  sind,  ist  _POSIX_MEMLOCK_RANGE in
       <unistd.h> definiert und die Anzahl der Bytes pro Seite kann der Konstante PAGESIZE (wenn  sie  definiert
       ist) in <limits.h> entnommen werden oder durch einen Aufruf von sysconf(_SC_PAGESIZE) bestimmt werden.

       Auf  POSIX-Systemen,  auf  denen  mlockall()  und  munlockall()  verfügbar  sind,  ist  _POSIX_MEMLOCK in
       <unistd.h> als ein Wert größer als 0 definiert. (Siehe auch sysconf(3).)

ANMERKUNGEN

       Das    Sperren    von     Speicher     hat     zwei     Hauptanwendungen:     Echtzeitalgorithmen     und
       Hochsicherheits-Datenverarbeitung.  Echtzeitanwendungen erfordern deterministisches Timing, und, wie auch
       Scheduling, ist Paging einer der Hauptgründe für unerwartete  Verzögerungen  in  der  Programmausführung.
       Echtzeitanwendungen werden außerdem für gewöhnlich mit sched_setscheduler(2) auf einen Echtzeit-Scheduler
       umschalten. Kryptographische Sicherheitssoftware stellt oft  sicherheitskritische  Bytes  wie  Passwörter
       oder  geheime  Schlüssel  als  Datenstrukturen  dar.  Durch  Paging  könnten diese geheimen Daten auf ein
       permanentes Auslagerungsspeichermedium  übertragen  werden,  von  wo  aus  sie  auch  dann  noch  Dritten
       zugänglich  sein  können,  lange  nachdem  das  Programm die geheimen Daten aus dem RAM gelöscht und sich
       beendet hat. (Bedenken Sie bitte, dass  der  Suspend-Modus  von  Laptops  und  manchen  Desktop-Rechnern,
       unabhängig von Speichersperren, eine Kopie des RAMs auf der Platte speichern wird.)

       Echtzeitprozesse,  die  mittels  mlockall()  Verzögerungen  durch  Page  Faults (Seitenfehler) vermeiden,
       sollten ausreichend gesperrte Stackseiten reservieren, bevor  sie  in  die  zeitkritische  Phase  treten,
       sodass  durch einen Funktionsaufruf kein Fehler entstehen kann. Dies kann durch den Aufruf einer Funktion
       erreicht werden, die eine ausreichend große automatische Variable (ein Feld) erzeugt und in den  Speicher
       schreibt, in dem die Variable liegt, um diese Stackseiten zu belegen. Auf diesem Wege werden genug Seiten
       für den Stack bereitgestellt und können im RAM verriegelt werden. Der Schreibvorgang stellt sicher,  dass
       nicht einmal ein Schreib-Kopier-Seitenfehler in der kritischen Phase eintreten kann.

       Speicherverriegelungen  werden  nicht  an  mittels  fork(2) erzeugte Kindprozesse vererbt und durch einen
       Aufruf von execve(2) oder das Ende des Prozesses automatisch  entfernt  (entriegelt).  Die  Einstellungen
       MCL_FUTURE  und  MCL_FUTURE  |  MCL_ONFAULT  in mlockall() werden nicht von einem Kindprozess ererbt, der
       mittels fork(2) erzeugt wurde und werden während eines execve(2) gelöscht.

       Note that fork(2)  will prepare the address space for a copy-on-write operation. The consequence is  that
       any  write  access  that  follows  will  cause  a  page fault that in turn may cause high latencies for a
       real-time process. Therefore, it is crucial not  to  invoke  fork(2)   after  an  mlockall()  or  mlock()
       operation—not  even  from  a thread which runs at a low priority within a process which also has a thread
       running at elevated priority.

       Die Speicherverriegelung wird automatisch entfernt, wenn der Adressbereich mittels munmap(2) ausgeblendet
       wird.

       Speichersperren  werden  nicht hochgezählt (»gestapelt«), das heißt, Seiten die mehrmals durch den Aufruf
       von mlockall(), mlock2() oder mlock() gesperrt wurden werden durch einen einzigen  Aufruf  von  munlock()
       für  den  entsprechenden  Bereich  oder  durch  munlockall()  sofort  wieder  freigegeben. Seiten, die an
       verschiedene Orte oder für verschiedene Prozesse eingeblendet wurden, bleiben solange im RAM  verriegelt,
       wie sie mindestens an einem Ort oder durch einen Prozess benötigt werden.

       Wenn  einem  Aufruf  von  mlockall(),  der  den Schalter MCL_FUTURE nutzt, ein weiterer Aufruf folgt, der
       diesen Schalter nicht angibt, gehen die durch den Aufruf von MCL_FUTURE erwirkten Änderungen verloren.

       The mlock2()  MLOCK_ONFAULT flag and the mlockall()  MCL_ONFAULT flag allow efficient memory locking  for
       applications  that  deal  with  large  mappings  where only a (small) portion of pages in the mapping are
       touched. In such cases, locking all of the pages in a mapping  would  incur  a  significant  penalty  for
       memory locking.

   Linux-Anmerkungen
       Unter Linux runden mlock(), mlock2() und munlock() addr automatisch zur nächsten Seitengrenze ab. Da aber
       die POSIX.1-Spezifikation von mlock() und munlock() Implementierungen gestattet, welche  die  Ausrichtung
       von addr an Seitengrenzen fordern, sollten portable Anwendungen die Ausrichtung sicherstellen.

       Das  Feld VmLck der Linux-spezifischen Datei /proc/[PID]/status gibt an, wie viele Kilobytes Speicher der
       Prozess mit der ID PID mittels mlock(), mlock2(), mlockall() und  mmap(2)  mit  dem  Schalter  MAP_LOCKED
       verriegelt hat.

   Grenzen und Zugriffsrechte
       Bis  einschließlich  Linux  2.6.8  muss  ein  Prozess  privilegiert  sein  (CAP_IPC_LOCK), um Speicher zu
       verriegeln. Die weiche Systembegrenzung  RLIMIT_MEMLOCK  bestimmt  einen  Speicher-Schwellwert,  den  der
       Prozess verriegeln darf.

       Seit   Linux   2.6.9   kann  ein  privilegierter  Prozess  unbegrenzt  Speicher  verriegeln.  Die  weiche
       Systembegrenzung RLIMIT_MEMLOCK legt stattdessen fest, wieviel Speicher ein nicht privilegierter  Prozess
       verriegeln darf.

FEHLER

       In  Linux 4.8 und ältern bedeutete ein Fehler in der Bilanzierung des Kernels für gesperrten Speicher von
       unprivilegierten Prozessen (d.h.  solchen  ohne  CAP_IPC_LOCK),  das  die  gesperrten  Bytes,  die  einer
       überlappenden  (falls  vorhanden) und durch addr und len festgelegte Region liegen, beim Prüfen gegen die
       Begrenzung doppelt zählten. Solche Doppelbilanzierung konnte zu einem inkorrekten  Wert  für  den  »total
       locked memory« für den Prozess, der die Begrenzung RLIMIT_MEMLOCK überschritt, führen. Damit konnten dann
       mlock() und mlock2() fehlschlagen, obwohl die Anfragen hätten  erfolgreich  sein  sollen.  Dieser  Fehler
       wurde in Linux 4.9 behoben.

       In  den  Linux-Kerneln  2.4.x bis einschließlich 2.4.17 bewirkte ein Fehler, dass der Schalter MCL_FUTURE
       von mlockall() über einen Aufruf von fork(2) vererbt wurde. Dies wurde in Kernel 2.4.18 behoben.

       Seit Kernel 2.6.9 werden, falls ein privilegierter Prozess mlockall(MCL_FUTURE) aufruft und  anschließend
       Privilegien aufgibt (die Capability CAP_IPC_LOCK verliert, weil er beispielsweise seine effektive UID auf
       einen von null  verschiedenen  Wert  setzt),  nachfolgende  Speicherzuordnungen  (z.B.  mmap(2),  brk(2))
       fehlschlagen, wenn die Ressourcengrenze RLIMIT_MEMLOCK berührt wird.

SIEHE AUCH

       mincore(2), mmap(2), setrlimit(2), shmctl(2), sysconf(3), proc(5), capabilities(7)

KOLOPHON

       Diese  Seite  ist  Teil  der  Veröffentlichung  4.15  des Projekts Linux-man-pages. Eine Beschreibung des
       Projekts, Informationen, wie Fehler gemeldet werden können sowie die aktuelle Version dieser Seite finden
       sich unter https://www.kernel.org/doc/man-pages/.

ÜBERSETZUNG

       Die  deutsche  Übersetzung  dieser  Handbuchseite  wurde  von  Michaela  Hohenner  <mhohenne@techfak.uni-
       bielefeld.de>,  Hanno  Wagner  <wagner@bidnix.bid.fh-hannover.de>,  Martin  Schulze  <joey@infodrom.org>,
       Martin  Eberhard  Schauer <Martin.E.Schauer@gmx.de>, Mario Blättermann <mario.blaettermann@gmail.com> und
       Helge Kreutzmann <debian@helgefjell.de> erstellt.

       Diese Übersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder  neuer
       bezüglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen.

       Wenn  Sie  Fehler  in  der  Übersetzung  dieser  Handbuchseite  finden, schicken Sie bitte eine E-Mail an
       <debian-l10n-german@lists.debian.org>.