MLOCKALL(2)

BEZEICHNUNG
mlockall - Schaltet Paging für den aktuellen Prozeß aus.

ÜBERSICHT
#include <sys/mman.h>

int mlockall(int flags);

BESCHREIBUNG
mlockall sperrt das Paging für alle Seiten, die in den Adreßraum des aufrufenden Prozesses eingebunden sind. Dieses bezieht sich auf die Seiten des Code-, Daten- und Stacksegments genauso wie auf gemeinsame Bibliotheken, Kernel-Daten im Userspace, Shared Memory und Shared Dateien. Es ist garantiert, daß alle eingebundenen Speicherseiten im RAM bleiben, wenn der mlockall-Aufruf erfolgreich zurückkehrt. Und es wird ebenfalls garantiert, daß sie solange im RAM bleiben, bis die Seiten mit munlock oder munlockall entsperrt werden, das Programm terminiert wird oder mit exec ein anderes Programm aufruft. Diese Sperrungen werden nicht an Tochterprozesse über ein fork hinaus vererbt. Das Sperren von Speicher hat zwei Hauptanwendungen: Echtzeitalgorithmen und Hochsicherheits-Datenverarbeitung. Echtzeitalgorithmen erfordern deterministisches Timing, und, wie auch Scheduling, ist Paging einer der Hauptgründe für unerwartete Verzögerungen in der Programmausführung. Echtzeitapplikationen werden außerdem für gewöhnlich mit sched_setscheduler auf einen Echtzeit-Scheduler umschalten. Kryptographische Sicherheitssoftware arbeitet oft mit sicherheitskritischen Bytes wie Paßwörtern oder geheimen Schlüsseln als Datenstrukturen. Durch Paging könnten diese geheimen Daten auf eine permanente Swappartition ü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. Für Sicherheitsapplikationen müssen nur kleine Teile des Speichers gesperrt werden. Dafür steht mlock zur Verfügung. Die flags Parameter können mit logischem ODER aus folgenden Konstanten konstruiert werden:

MCL_CURRENT
    Sperrt alle Seiten, die momentan in den Adreßraum des Prozesses umgerechnet sind.

MCL_FUTURE
    Sperrt alle Seiten, die in Zukunft in den Adreßraum des Prozesses gelegt werden. Das könnten zum Beispiel neue Adreßseiten sein, die bei einem sich vergrößernden Heap und Stack benötigt werden, Dateien, die in den Speicher gebunden werden, oder gemeinsam benutzte Speicherregionen.

Wenn MCL_FUTURE angegeben ist und die Anzahl der gesperrten Seiten das obere Limit der zulässigen gesperrten Seiten überschreitet, wird der Systemaufruf, der das neue umrechnen veranlaßte mit ENOMEM fehlschlagen. Wenn diese Seiten durch wachsenden Stack eingebunden wurden, wird der Kernel die Ausdehnung des Stacks nicht zulassen und ein SIGSEGV an den Prozeß senden. Echtzeitprozesse sollten genug gesperrte Stackseiten reservieren, bevor sie in die zeitkritische Phase treten, so daß kein Fehler durch einen Funktionsaufruf entstehen kann. Dies kann durch den Aufruf einer Funktion erreicht werden, die eine ausreichend große automatische Variable erzeugt und in den Speicher schreibt, in dem diese liegt, um diese Stackseiten zu belegen. Auf diesem Wege werden genug Seiten für den Stack bereitgestellt und können im RAM gesperrt werden. Der Schreibvorgang stellt sicher, daß nicht einmal ein Schreib-Kopier-Seitenfehler in der kritischen Phase entstehen können. Speichersperren werden nicht gestapelt, das heißt, Seiten die mehrmals durch den Aufruf von mlockall oder mlock gesperrt wurden werden sofort wieder freigegeben durch einen einzigen Aufruf von munlockall. Seiten die an verschiedene Orte oder für verschiedene Prozesse bereitgestellt wurden bleiben solange im RAM gesperrt wie sie mindestens an einen Ort oder durch einen Prozeß benötigt werden. In POSIX Systemen, wo mlockall und munlockall verfügbar sind, ist _POSIX_MEMLOCK definiert in <unistd.h>.

RÜCKGABEWERT
Bei Erfolg gibt mlockall eine Null aus. Falls ein Fehler auftritt wird ein -1 zurückgegeben und errno sofort gesetzt.

FEHLER

ENOMEM
    Der Prozeß versuchte die maximal zulässige Anzahl gesperrter Seiten zu überschreiten.

EPERM
    Der Aufrufende Prozeß hat nicht die erforderlichen Rechte. Nur Rootprozesse dürfen Seiten sperren.

EINVAL
    Unbekannte Flags wurden angegeben.

STANDARDS
POSIX.1b, SVR4

SIEHE AUCH
 munlockall (2), mlock(2), und munlock(2).