focal (2) mremap.2.gz

Provided by: manpages-de-dev_2.16-1_all bug

BEZEICHNUNG

       mremap - verlegt eine virtuelle Speicheradresse

ÜBERSICHT

       #define _GNU_SOURCE         /* siehe feature_test_macros(7) */
       #include <sys/mman.h>

       void *mremap(void *old_address, size_t old_size,
                    size_t new_size, int flags,  /* void *new_address */);

BESCHREIBUNG

       mremap()   expands  (or  shrinks)  an  existing  memory  mapping,  potentially moving it at the same time
       (controlled by the flags argument and the available virtual address space).

       old_address ist die alte Adresse des virtuellen Speicherblocks, den  man  vergrößern  (oder  verkleinern)
       möchte.  Beachten  Sie,  dass  old_address an den Speicherseiten ausgerichtet sein muss. old_size ist die
       alte  Größe  des  virtuellen  Speicherblocks.  new_size  ist  die  angeforderte  Größe   des   virtuellen
       Speicherblocks nach der Größenänderung. Optional kann ein fünftes Argument, new_address angegeben werden;
       siehe die folgende Beschreibung von MREMAP_FIXED.

       If the value  of  old_size  is  zero,  and  old_address  refers  to  a  shareable  mapping  (see  mmap(2)
       MAP_SHARED), then mremap()  will create a new mapping of the same pages. new_size will be the size of the
       new mapping and the location of the new mapping may be specified with new_address; see the description of
       MREMAP_FIXED below. If a new mapping is requested via this method, then the MREMAP_MAYMOVE flag must also
       be specified.

       In Linux the memory is divided into pages. A user process has (one  or)  several  linear  virtual  memory
       segments.  Each virtual memory segment has one or more mappings to real memory pages (in the page table).
       Each virtual memory segment has its own protection  (access  rights),  which  may  cause  a  segmentation
       violation if the memory is accessed incorrectly (e.g., writing to a read-only segment). Accessing virtual
       memory outside of the segments will also cause a segmentation violation.

       mremap() benutzt das Linux-Schema für »page tables« (Seitentabellen).  mremap()  ändert  die  Verknüpfung
       zwischen  virtuellen  Adressen  und  Speicherseiten.  Dies  kann  benutzt werden, um ein sehr effizientes
       realloc(3) zu implementieren.

       Das Bitmasken-Argument flags kann 0 sein oder die folgenden Schalter enthalten:

       MREMAP_MAYMOVE
              By default, if there is not sufficient space to expand a mapping at  its  current  location,  then
              mremap()   fails.  If this flag is specified, then the kernel is permitted to relocate the mapping
              to a new virtual address, if necessary. If the mapping is relocated, then absolute  pointers  into
              the  old  mapping location become invalid (offsets relative to the starting address of the mapping
              should be employed).

       MREMAP_FIXED (seit Linux 2.3.31)
              This flag serves a similar purpose to the MAP_FIXED flag of mmap(2). If this  flag  is  specified,
              then mremap()  accepts a fifth argument, void *new_address, which specifies a page-aligned address
              to which the mapping must be moved. Any  previous  mapping  at  the  address  range  specified  by
              new_address  and new_size is unmapped. If MREMAP_FIXED is specified, then MREMAP_MAYMOVE must also
              be specified.

       Falls das von old_address und old_size 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.

RÜCKGABEWERT

       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 entsprechend gesetzt.

FEHLER

       EAGAIN Der Aufrufende versuchte, ein gesperrtes Speichersegment zu vergrößern.  Das  war  nicht  möglich,
              ohne die Resourcen-Begrenzung RLIMIT_MEMLOCK zu überschreiten.

       EFAULT "Segmentation  fault." Some address in the range old_address to old_address+old_size is an invalid
              virtual memory address for this process. You can also get EFAULT even if there exist mappings that
              cover the whole address space requested, but those mappings are of different types.

       EINVAL Ein ungültiges Argument wurde übergeben. Mögliche Gründe sind:

              *  old_address war nicht an der Seitengrenze ausgerichtet

              *  ein von MREMAP_MAYMOVE oder MREMAP_FIXED verschiedener Wert wurde in flags übergeben

              *  new_size war Null

              *  new_size oder new_address war ungültig

              *  der  neue  Adressbereich,  der  in  new_address und new_size angegeben wurde, überlappte den in
                 old_address und old_size angegebenen alten Adressbereich

              *  MREMAP_FIXED wurde angegeben, ohne auch MREMAP_MAYMOVE anzugeben

              *  old_size was zero and old_address does not refer to a shareable mapping (but see BUGS);

              *  old_size war Null und der Schalter MREMAP_MAYMOVE war nicht angegeben

       ENOMEM Der Speicherbereich kann an der aktuellen virtuellen Adresse nicht erweitert werden und  in  flags
              ist  der  Schalter  MREMAP_MAYMOVE  nicht  gesetzt.  Oder  es gibt nicht genug freien (virtuellen)
              Speicher.

KONFORM ZU

       Dieser Aufruf ist Linux-spezifisch und sollte nicht in portierbaren Programmen benutzt werden.

ANMERKUNGEN

       Vor Version 2.4 machte die Glibc die Definition von MREMAP_FIXED nicht verfügbar  und  der  Prototyp  für
       mremap() ließ das Argument new_address nicht zu.

       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.

FEHLER

       Before  Linux 4.14, if old_size was zero and the mapping referred to by old_address was a private mapping
       (mmap(2) MAP_PRIVATE), mremap()  created a new private mapping unrelated to the  original  mapping.  This
       behavior  was  unintended  and  probably  unexpected  in  user-space applications (since the intention of
       mremap()  is to create a new mapping based on the original mapping). Since Linux  4.14,  mremap()   fails
       with the error EINVAL in this scenario.

SIEHE AUCH

       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. Tannenbaum, Inside Linux von Randolf Bentson, The  Design  of  the  UNIX  Operating
       System von Maurice J. Bach.)

KOLOPHON

       Diese  Seite  ist  Teil  der  Veröffentlichung  5.03  des Projekts Linux-man-pages. Eine Beschreibung des
       Projekts, Informationen, wie Fehler gemeldet werden können sowie die aktuelle Version dieser Seite finden
       sich unter https://www.kernel.org/doc/man-pages/.

ÜBERSETZUNG

       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
       <debian-l10n-german@lists.debian.org>.