MMAP(2)

BEZEICHNUNG
mmap, munmap - lege Dateien oder Devices in Speicherbereich

ÜBERSICHT
#include <unistd.h>
#include <sys/mman.h>

#ifdef _POSIX_MAPPED_FILES

void * mmap(void *start, size_t length, int prot , int flags, int fd, off_t offset);

int munmap(void *start, size_t length);

#endif

BESCHREIBUNG
Die Funktion mmap projeziert length Bytes von der Datei (oder einem anderen Objekt) fd, ab dem Offset ofset, in einen Speicherbereich, vorzugsweise ab der Adresse start. Die letzte Adresse ist nur ein Tip und wird normalerweise nicht angegeben, indem 0 eingetragen wird. Der tatsächliche Platz, an dem das Objekt projeziert wurde, wird von mmap zurückgegeben. Der Parameter prot beschreibt den gewünschte Speicherschutz. Er besteht aus folgenden Bits:

PROT_EXEC
    Die Seiten können ausgeführt werden.

PROT_READ
    Die Seiten dürfen gelesen werden.

PROT_WRITE
    Die Seiten dürfen geschrieben werden.

Der Parameter flags gibt den Typ des zu projezierenden Objekts und Projektionsoptionen an, sowie ob Veränderungen an der Kopie des projezierten Objekt für den Prozess privat sind oder mit anderen Referenzen gemeinsam genutzt werden. Er besteht aus folgenden Bits: MAP_FIXED Verwende keine andere Adresse also die angegebene. Wenn die angegebene Adresse nicht benutzt werden kenn, wird mmap fehlschlagen. Wenn MAP_FIXED angegeben ist, muß start ein Vielfaches der Seitengrösse sein. Von der Verwendung dieser Option wird abgeraten.

MAP_SHARED
    Die Seiten dürfen mit anderen Prozessen, die dieses Objekt ebenfalls in Speicher projezieren, gemeinsam benutzt werden.

MAP_PRIVATE
    Lege eine private Copy-on-Write Projektion des Objekts an.

Die obigen drei Flags sind in POSIX.4 beschrieben. Linux kennt zusätzlich noch MAP_DENYWRITE, MAP_EXECUTABLE und MAP_ANON(YMOUS). Der munmap-Systemaufruf löscht die Projektionen im angegebenen Speicherbereich. Zukünftige Zugriffen auf diesen Adressraum erzeugen einen Fehler vom Typ "invalid memory reference" - Ungültiger Speicherzugriff.

RÜCKGABEWERT
Bei Erfolg gibt mmap einen Zeiger auf den projezierten Speicherbereich zurück. Bei Fehlern wird MAP_FAILED (-1) zurückgegeben und errno entsprechend gesetzt. Bei erfolgreichen Ausführung gibt munmap 0 zurück, bei Fehlern -1 und setzt errno (meistens auf EINVAL).

FEHLER

EBADF
    fd ist kein güliger Dateideskriptor (und MAP_ANONYMOUS wurde nicht angegeben).

EACCES
    MAP_PRIVATE wurde angegeben, aber fd wurde nicht zum Lesen geöffnet. Oder MAP_SHARED wurde spezifiziert, PROT_WRITE ist gesetzt und fd ist nicht zum Schreiben geöffnet.

EINVAL
    Die Adressen, die durch start, length und offset angegeben wurden, sind ungültig. (Z.B. sind sie zu groß oder nicht an der einer Speicherseitengröße ausgerichtet.)

ETXTBUSY
    MAP_DENYWRITE wurde angegeben, aber das Objekt, das durch fd bezeichnit wurde, ist zum Schreiben geöffnet.

EAGAIN
    Die Datei ist gelockt (wird von einem anderen Prozeß oder Thread gehalten) oder zuviel Speicher ist gelockt.

ENOMEM
    Es steht kein Speicher mehr zur Verfügung.

KONFORM ZU
POSIX.4.

SIEHE AUCH
getpagesize(2), msync(2), shm_open(2), B.O. Gallmeister POSIX.4 O'Reilly pp. 128-129 and 389-391.