.\" -*- coding: UTF-8 -*- .\" Copyright (c) 1996 Tom Bjorkholm .\" .\" SPDX-License-Identifier: GPL-2.0-or-later .\" .\" 1996-04-11 Tom Bjorkholm .\" First version written (1.3.86) .\" 1996-04-12 Tom Bjorkholm .\" Update for Linux 1.3.87 and later .\" 2005-10-11 mtk: Added NOTES for MREMAP_FIXED; revised EINVAL text. .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH mremap 2 "2. Mai 2024" "Linux man\-pages 6.8" .SH BEZEICHNUNG mremap \- eine virtuelle Speicheradresse neu mappen .SH BIBLIOTHEK Standard\-C\-Bibliothek (\fIlibc\fP, \fI\-lc\fP) .SH ÜBERSICHT .nf \fB#define _GNU_SOURCE\fP /* siehe feature_test_macros(7) */ \fB#include \fP .P \fBvoid *mremap(void \fP\fIalte_Adresse\fP\fB[.\fP\fIalte_Größe\fP\fB], size_t \fP\fIalte_Größe\fP\fB,\fP \fB size_t \fP\fIneue_Größe\fP\fB, int \fP\fISchalter\fP\fB, … /* void *\fP\fIneue_Adresse\fP\fB */);\fP .fi .SH BESCHREIBUNG \fBmremap\fP() erweitert (oder verkleinert) ein bestehendes Speicher\-Mapping, potenziell durch gleichzeitiges Verschieben (bestimmt durch das Argument \fISchalter\fP und den zur Verfügung stehenden virtuellen Speicherplatz). .P \fIalte_Adresse\fP ist die alte Adresse des virtuellen Speicherblocks, den man vergrößern (oder verkleinern) möchte. Beachten Sie, dass \fIalte_Adresse\fP an den Speicherseiten ausgerichtet sein muss. \fIalte_Größe\fP ist die alte Größe des virtuellen Speicherblocks. \fIneue_Größe\fP ist die angeforderte Größe des virtuellen Speicherblocks nach der Größenänderung. Optional kann ein fünftes Argument, \fIneue_Adresse\fP, angegeben werden; siehe die folgende Beschreibung von \fBMREMAP_FIXED\fP. .P Falls der Wert von \fIalte_Größe\fP Null ist und sich \fIalte_Adresse\fP auf ein gemeinsam benutzbares Mapping bezieht (siehe die Beschreibung von \fBMAP_SHARED\fP in \fBmmap\fP(2)), dann wird \fBmremap\fP() ein neues Mapping der gleichen Seiten erstellen. \fIneue_Größe\fP wird die Größe des neuen Mappings sein und der Ort des neuen Mappings kann mit \fIneue_Adresse\fP festgelegt werden, siehe die nachfolgende Beschreibung von \fBMREMAP_FIXED\fP. Falls mittels dieser Methode ein neues Mapping angefordert wird, dann muss der Schalter \fBMREMAP_MAYMOVE\fP angegeben werden. .P Das Bitmasken\-Argument \fISchalter\fP kann 0 sein oder die folgenden Schalter enthalten: .TP \fBMREMAP_MAYMOVE\fP Per Voreinstellung schlägt \fBmremap\fP() fehl, wenn an der aktuellen Position nicht ausreichend Platz vorhanden ist, um ein Mapping zu vergrößern. Wird dieser Schalter angegeben, darf der Kernel das Speicher\-Mapping an eine neue virtuelle Adresse verlegen, falls das erforderlich ist. Wenn das Mapping verlegt wurde, werden absolute Zeiger zum Ort des alten Mappings ungültig. (Es sollten Offsets relativ zur Anfangsadresse des Mappings verwendet werden.) .TP \fBMREMAP_FIXED\fP (seit Linux 2.3.31) Dieser Schalter dient einem ähnlichen Zweck wie der Schalter \fBMAP_FIXED\fP von \fBmmap\fP(2). Wenn dieser Schalter angegeben wird, dann akzeptiert \fBmremap\fP() ein fünftes Argument, \fIvoid\ *neue_Adresse\fP, das eine an Seiten ausgerichtete Adresse angibt, an die das Mapping verschoben werden muss. Alle früheren Mappings auf den von \fIneue_Adresse\fP und \fIneue_Größe\fP angegebenen Adressbereich werden verworfen. .IP Falls \fBMREMAP_FIXED\fP angegeben wird, muss ebenfalls \fBMREMAP_MAYMOVE\fP angegeben werden. .TP \fBMREMAP_DONTUNMAP\fP (seit Linux 5.7) .\" commit e346b3813067d4b17383f975f197a9aa28a3b077 Dieser Schalter, der zusammen mit \fBMREMAP_MAYMOVE\fP verwandt werden muss, verlegt das Mapping auf eine neue Adresse, aber entfernt das Mapping an der \fIalte_Adresse\fP nicht. .IP Der Schalter \fBMREMAP_DONTUNMAP\fP kann nur zusammen mit privaten anonymen Mappings verwandt werden (siehe die Beschreibung von \fBMAP_PRIVATE\fP und \fBMAP_ANONYMOUS\fP in \fBmmap\fP(2)). .IP Nach Abschluss wird jeder Zugriff auf den durch \fIalte_Adresse\fP und \fIalte_Größe\fP festgelegten Bereich zu einer Seitenausnahmebehandlung führen. Die Seitenausnahmebehandlung wird durch den Handler \fBuserfaultfd\fP(2) erledigt, falls die Adresse in dem vorher mit \fBuserfaultfd\fP(2) registrierten Bereich liegt. Andernfalls wird der Kernel einen mit Nullen gefüllten Bereich belegen, der die Ausnahmebehandlung erledigt. .IP Der Schalter \fBMREMAP_DONTUNMAP\fP kann zur atomaren Verschiebung eines Mappings verwandt werden, wobei die Quelle gemappt bleibt. Siehe ANMERKUNGEN für mögliche Anwendungen von \fBMREMAP_DONTUNMAP\fP. .P Falls das von \fIalte_Adresse\fP und \fIalte_Größe\fP angegebene Speichersegment gesperrt ist (mittels \fBmlock\fP(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. .SH RÜCKGABEWERT Bei Erfolg gibt \fBmremap\fP() einen Zeiger auf den neuen virtuellen Speicherbereich zurück. Im Fehlerfall wird der Wert von \fBMAP_FAILED\fP (d.h. \fI(void\ *)\ \-1\fP) zurückgegeben und \fIerrno\fP gesetzt, um den Fehler anzuzeigen. .SH FEHLER .TP \fBEAGAIN\fP Der Aufrufende versuchte, ein gesperrtes Speichersegment zu vergrößern. Das war nicht möglich, ohne die Resourcen\-Begrenzung \fBRLIMIT_MEMLOCK\fP zu überschreiten. .TP \fBEFAULT\fP Eine Adresse im Bereich von \fIalte_Adresse\fP bis \fIalte_Adresse\fP+\fIalte_Größe\fP ist für diesen Prozess eine ungültige virtuelle Speicheradresse. Man erhält sogar \fBEFAULT\fP, wenn Mappings existieren, die den gesamten angeforderten Adressraum abdecken, aber von unterschiedlichem Typ sind. .TP \fBEINVAL\fP Ein ungültiges Argument wurde übergeben. Mögliche Gründe sind: .RS .IP \[bu] 3 \fIalte_Adresse\fP war nicht an der Seitengrenze ausgerichtet .IP \[bu] ein von \fBMREMAP_MAYMOVE\fP, \fBMREMAP_FIXED\fP oder \fBMREMAP_DONTUNMAP\fP verschiedener Wert wurde in \fISchalter\fP übergeben .IP \[bu] \fIneue_Größe\fP war Null .IP \[bu] \fIneue_Größe\fP oder \fIneue_Adresse\fP war ungültig .IP \[bu] der neue Adressbereich, der in \fIneue_Adresse\fP und \fIneue_Größe\fP angegeben wurde, überlappte den in \fIalte_Adresse\fP und \fIalte_Größe\fP angegebenen alten Adressbereich .IP \[bu] \fBMREMAP_FIXED\fP oder \fBMREMAP_DONTUNMAP\fP wurde angegeben, ohne auch \fBMREMAP_MAYMOVE\fP anzugeben .IP \[bu] \fBMREMAP_DONTUNMAP\fP wurde angegeben, aber eine oder mehrere Seiten in dem durch \fIalte_Adresse\fP und \fIalte_Größe\fP festgelegten Bereich waren nicht privat anonym .IP \[bu] \fBMREMAP_DONTUNMAP\fP wurde angegeben und \fIalte_Größe\fP war nicht zu \fIneue_Größe\fP identisch .IP \[bu] \fIalte_Größe\fP war Null und \fIalte_Adresse\fP bezieht sich nicht auf ein gemeinsam benutzbares Mapping (siehe aber FEHLER) .IP \[bu] \fIalte_Größe\fP war Null und der Schalter \fBMREMAP_MAYMOVE\fP war nicht angegeben .RE .TP \fBENOMEM\fP Zur Ausführung der Aktion war nicht genug Speicher verfügbar. Mögliche Gründe sind: .RS .IP \[bu] 3 Der Speicherbereich kann an der aktuellen virtuellen Adresse nicht erweitert werden und in \fISchalter\fP ist der Schalter \fIMREMAP_MAYMOVE\fP nicht gesetzt. Oder es gibt nicht genug freien (virtuellen) Speicher. .IP \[bu] \fBMREMAP_DONTUNMAP\fP wurde verwandt und verursachte dadurch die Erstellung eines neuen Mappings, das den verfügbaren (virtuellen) Speicher überschreiten würde. Oder es würde die maximale Anzahl an erlaubten Mappings überschreiten. .RE .SH STANDARDS Linux. .SH GESCHICHTE .\" 4.2BSD had a (never actually implemented) .\" .BR mremap (2) .\" call with completely different semantics. .\" .P Vor Version 2.4 machte die Glibc die Definition von \fBMREMAP_FIXED\fP nicht verfügbar und der Prototyp für \fBmremap\fP() ließ das Argument \fIneue_Adresse\fP nicht zu. .SH ANMERKUNGEN \fBmremap\fP() ändert das Mapping zwischen virtuellen Adressen und Speicherseiten. Dies kann benutzt werden, um ein sehr effizientes \fBrealloc\fP(3) zu implementieren. .P 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, \fBSIGSEGV\fP) 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. .P .\" Falls \fBmremap\fP() dazu verwandt wird, einen mit \fBmlock\fP(2) oder Äquivalentem gesperrten Bereich zu verschieben oder zu erweitern, wird der Aufruf \fBmremap\fP() sich die beste Mühe geben, den neuen Bereich zu bestücken, wird aber nicht mit \fBENOMEM\fP fehlschlagen, falls der Bereich nicht bestückt werden kann. .SS "Anwendungsfälle für MREMAP_DONTUNMAP" Mögliche Anwendungen für \fBMREMAP_DONTUNMAP\fP sind unter Anderem: .IP \[bu] 3 Nicht kooperatives \fBuserfaultfd\fP(2): eine Anwendung kann sich einen virtuellen Adressbereich mittels \fBMREMAP_DONTUNMAP\fP schnappen und dann einen \fBuserfaultfd\fP(2)\-Handler einsetzen, um die Seitenausnahmebehandlungen zu handhaben, die nachfolgend auftreten, wenn andere Threads in dem Prozess auf Seiten in dem geschnappten Bereich zugreifen. .IP \[bu] Automatische Speicherbereinigung: \fBMREMAP_DONTUNMAP\fP kann im Zusammenspiel mit \fBuserfaultfd\fP(2) verwandt werden, um Algorithmen für automatische Speicherbereinigung zu implementieren (z.B. in einer virtuellen Java\-Maschine). Eine solche Implementierung kann billiger (und einfacher) als konventionelle automatische Speicherbereinigungstechniken sein, die Seiten mit einem \fBPROT_NONE\fP\-Schutz im Zusammenspiel mit dem \fBSIGSEGV\fP\-Handler markieren, um Zugriff auf diese Seiten abzufangen. .SH FEHLER .\" commit dba58d3b8c5045ad89c1c95d33d01451e3964db7 Vor Linux 4.14 erstellte \fBmremap\fP() ein neues privates Mapping ohne Bezug zum ursprünglichen Mapping, falls \fIalte_Größe\fP Null war und das Mapping auf das \fIalte_Adresse\fP sich bezog, ein privates Mapping war (siehe die Beschreibung von \fBMAP_PRIVATE\fP in \fBmmap\fP(2)). Dieses Verhalten war nicht beabsichtigt und für Anwendungen im Benutzerbereich unerwartet (da es das Ziel von \fBmremap\fP() ist, ein neues Mapping basierend auf dem ursprünglichen Mapping zu erstellen). Seit Linux 4.14 schlägt \fBmremap\fP() in diesem Szenario mit dem Fehler \fBEINVAL\fP fehl. .SH "SIEHE AUCH" \fBbrk\fP(2), \fBgetpagesize\fP(2), \fBgetrlimit\fP(2), \fBmlock\fP(2), \fBmmap\fP(2), \fBsbrk\fP(2), \fBmalloc\fP(3), \fBrealloc\fP(3) .P Ihr Lieblingsbuch über Betriebssysteme für weitere Informationen über »paged memory«. (\fIModern Operating Systems\fP von Andrew S.\& Tanenbaum, \fIInside Linux\fP von Randolph Bentson, \fIThe Design of the UNIX Operating System\fP von Maurice J.\& Bach.) .PP .SH ÜBERSETZUNG Die deutsche Übersetzung dieser Handbuchseite wurde von Patrick Rother , Martin Eberhard Schauer , Mario Blättermann und Helge Kreutzmann erstellt. .PP Diese Übersetzung ist Freie Dokumentation; lesen Sie die .UR https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 .UE oder neuer bezüglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen. .PP Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die .MT debian-l10n-german@lists.debian.org Mailingliste der Übersetzer .ME .