Provided by: manpages-de-dev_2.5-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  4.15  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 FIXME: Once mapping is properly
       translated,     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>.