Available in

(2) (3) (2)/de (2)/es (2)/fr (2)/ja (2)/ko

Contents

BEZEICHNUNG

mlockall − Schaltet Paging für den aktuellen Prozess aus.

ÜBERSICHT

#include <sys/mman.h>

int mlockall(int flags);

BESCHREIBUNG

mlockall sperrt das Paging für alle Seiten, die in den Adressraum 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, dass alle eingebundenen Speicherseiten im RAM bleiben, wenn der mlockall−Aufruf erfolgreich zurückkehrt. Und es wird ebenfalls garantiert, dass 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 Passwö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 Adressraum des Prozesses umgerechnet sind.

MCL_FUTURE

Sperrt alle Seiten, die in Zukunft in den Adressraum des Prozesses gelegt werden. Das könnten zum Beispiel neue Adressseiten 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 Prozess senden.

Echtzeitprozesse sollten genug gesperrte Stackseiten reservieren, bevor sie in die zeitkritische Phase treten, so dass 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, dass 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 Prozess 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 −1 zurückgegeben und errno sofort gesetzt.

FEHLER

ENOMEM

Der Prozess versuchte die maximal zulässige Anzahl gesperrter Seiten zu überschreiten.

EPERM

Der aufrufende Prozess 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).

COMMENTS

blog comments powered by Disqus