mremap(2) | System Calls Manual | mremap(2) |
mremap - eine virtuelle Speicheradresse neu mappen
Standard-C-Bibliothek (libc, -lc)
#define _GNU_SOURCE /* siehe feature_test_macros(7) */ #include <sys/mman.h>
void *mremap(void alte_Adresse[.alte_Größe], size_t alte_Größe, size_t neue_Größe, int Schalter, … /* void *neue_Adresse */);
mremap() erweitert (oder verkleinert) ein bestehendes Speicher-Mapping, potenziell durch gleichzeitiges Verschieben (bestimmt durch das Argument Schalter und den zur Verfügung stehenden virtuellen Speicherplatz).
alte_Adresse ist die alte Adresse des virtuellen Speicherblocks, den man vergrößern (oder verkleinern) möchte. Beachten Sie, dass alte_Adresse an den Speicherseiten ausgerichtet sein muss. alte_Größe ist die alte Größe des virtuellen Speicherblocks. neue_Größe ist die angeforderte Größe des virtuellen Speicherblocks nach der Größenänderung. Optional kann ein fünftes Argument, neue_Adresse, angegeben werden; siehe die folgende Beschreibung von MREMAP_FIXED.
Falls der Wert von alte_Größe Null ist und sich alte_Adresse auf ein gemeinsam benutzbares Mapping bezieht (siehe mmap(2) MAP_SHARED), dann wird mremap() ein neues Mapping der gleichen Seiten erstellen. neue_Größe wird die Größe des neuen Mappings sein und der Ort des neuen Mappings kann mit neue_Adresse festgelegt werden, siehe die nachfolgende Beschreibung von MREMAP_FIXED. Falls mittels dieser Methode ein neues Mapping angefordert wird, dann muss der Schalter MREMAP_MAYMOVE angegeben werden.
Das Bitmasken-Argument Schalter kann 0 sein oder die folgenden Schalter enthalten:
Falls das von alte_Adresse und alte_Größe angegebene Speichersegment gesperrt ist (mittels mlock(2) oder etwas Ähnlichem), wird diese Sperre aufrecht erhalten, wenn das Speichersegment verschoben oder seine Größe geändert wird. Als Folge davon kann sich die Größe des durch einen Prozess gesperrten Speichers ändern.
Bei Erfolg gibt mremap() einen Zeiger auf den neuen virtuellen Speicherbereich zurück. Im Fehlerfall wird der Wert von MAP_FAILED (d.h. (void *) -1) zurückgegeben und errno gesetzt, um den Fehler anzuzeigen.
Dieser Aufruf ist Linux-spezifisch und sollte nicht in portierbaren Programmen benutzt werden.
mremap() ändert das Mapping zwischen virtuellen Adressen und Speicherseiten. Dies kann benutzt werden, um ein sehr effizientes realloc(3) zu implementieren.
Unter Linux ist der Speicher in Seiten eingeteilt. Ein Prozess verfügt über (ein oder) mehrere lineare virtuelle Speichersegmente. Jedes virtuelle Speichersegment hat ein oder mehr Mappings auf reale Speicherseiten (in der Seitentabelle). Jedes virtuelle Speichersegment hat seinen eigenen Schutz (Zugriffsrechte), welcher eine Segmentverletzung (Segmentation violation, SIGSEGV) verursachen kann, wenn auf den Speicher nicht korrekt zugegriffen wird (z.B. beim Schreiben in ein schreibgeschütztes Segment). Zugreifen auf virtuellen Speicher außerhalb der Segmente verursacht ebenfalls eine Segmentverletzung.
Falls mremap() dazu verwandt wird, einen mit mlock(2) oder Äquivalentem gesperrten Bereich zu verschieben oder zu erweitern, wird der Aufruf mremap() sich die beste Mühe geben, den neuen Bereich zu bestücken, wird aber nicht mit ENOMEM fehlschlagen, falls der Bereich nicht bestückt werden kann.
Vor Version 2.4 machte die Glibc die Definition von MREMAP_FIXED nicht verfügbar und der Prototyp für mremap() ließ das Argument neue_Adresse nicht zu.
Mögliche Anwendungen für MREMAP_DONTUNMAP sind unter Anderem:
Vor Linux 4.14 erstellte mremap() ein neues privates Mapping ohne Bezug zum ursprünglichen Mapping, falls alte_Größe Null war und das Mapping auf das alte_Adresse sich bezog, ein privates Mapping war (mmap(2) MAP_PRIVATE). Dieses Verhalten war nicht beabsichtigt und für Anwendungen im Benutzerbereich unerwartet (da es das Ziel von mremap() ist, ein neues Mapping basierend auf dem ursprünglichen Mapping zu erstellen). Seit Linux 4.14 schlägt mremap() in diesem Szenario mit dem Fehler EINVAL fehl.
brk(2), getpagesize(2), getrlimit(2), mlock(2), mmap(2), sbrk(2), malloc(3), realloc(3)
Ihr Lieblingsbuch über Betriebssysteme für weitere Informationen über »paged memory«. (Modern Operating Systems von Andrew S. Tanenbaum, Inside Linux von Randolph Bentson, The Design of the UNIX Operating System von Maurice J. Bach.)
Die deutsche Übersetzung dieser Handbuchseite wurde von Patrick Rother <krd@gulu.net>, 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 die Mailingliste der Übersetzer.
5. Februar 2023 | Linux man-pages 6.03 |