Provided by: manpages-nl-dev_4.15.0-9_all bug

NAAM

       mmap, munmap - leg-uit of ont-leg-uit bestanden of apparaten in het werkgeheugen

SAMENVATTING

       #include <sys/mman.h>

       void *mmap(void *start, size_t lengte, int prot, int vlaggen,
                  int bi, off_t positie);
       int munmap(void *, size_t lengte);

       Zie NOTITIES voor informatie over functie test macro vereisten.

BESCHRIJVING

       mmap()   maakt  nieuwe  uit-legging  aan  in  de virtuele adres ruimte van het aanroepende
       proces. Het begin adres  van de nieuwe uit-legging wordt opgegeven in  start.  Het  lengte
       argument specificeert de lengte van de uit-legging (die groter moet zijn dan 0).

       Als  start   NULL  is, dan kiest de kernel een (aan een pagina-uitgelijnd) adres waarop de
       uit-legging gemaakt moet worden; dit is de meest overdraagbare methode  van  het  aanmaken
       van  een  nieuwe  uit-legging.  Als start niet NULL is, dan gebruikt de kernel het als een
       hint waarop de uit-legging geplaatst zou moeten  worden;  op  Linux,  zal  de  kernel  een
       nabijgelegen  pagina grens selecteren (maar altijd hoger of gelijk aan de waarde opgegeven
       in /proc/sys/vm/mmap_min_addr) en proberen om daar de uit-legging te maken.  Als  daar  al
       een  andere  uit-legging  bestaat, dan selecteert de kernel een nieuw adres dat al of niet
       afhankelijk is van de hint. Het adres van de nieuwe  uit-legging  wordt  teruggegeven  als
       resultaat van de aanroep.

       De  inhoud  van de bestand uit-legging (in tegenstelling tot een anonieme uit-legging; zie
       MAP_ANONYMOUS hieronder), wordt  geïnitialiseerd  door  lengte  bytes  beginnende  bij  de
       positie  in het bestand (of ander object( aangewezen door de bestandsindicator bi. positie
       moet   een   meervoud   zijn   van   de   pagina   grootte   zoals    teruggegeven    door
       sysconf(_SC_PAGE_SIZE).

       Nadat  de  mmap()  aanroep  is  beëindigt  kan de bestandsindicator bi onmiddellijk worden
       gesloten zonder het ongeldig maken van de uit-legging.

       Het prot argument beschrijft de vereiste geheugen bescherming van de uit-legging (dit moet
       niet  conflicteren  met  de  open  modus  van  het  bestand).  Het  is  of PROT_NONE of de
       bitsgewijze OR of een een of meer van de volgende vlaggen:

       PROT_EXEC  Pagina's mogen uitgevoerd worden.

       PROT_READ  Pagina's mogen gelezen worden.

       PROT_WRITE Pagina's mogen geschreven worden.

       PROT_NONE  Pagina's zijn niet toegankelijk.

   Het vlaggen argument
       De vlaggen argument bepaald of updates van  de  uit-legging  zichtbaar  zijn  voor  andere
       proces  uit-leggingen  in  dezelfde  regio,  en  of  updates  worden  doorgegeven naar het
       onderliggende bestand. Het gedrag wordt bepaald door exact een van de volgende waarden  in
       vlaggen:

       MAP_SHARED
              Deel  deze  uit-legging.  Updates  van  deze uit-legging zijn zichtbaar voor andere
              proces  uitleggingen  in  dezelfde  regio,  en  (in  het  geval  van  een  bestands
              uit-legging)  worden  doorgegeven  naar  het  onderliggende bestand. (Om precies te
              bepalen wanneer updates worden uitgevoerd naar het  onderliggende  bestand  is  het
              nodig om msync(2) te gebruiken.)

       MAP_SHARED_VALIDATE (sinds Linux 4.15)
              Deze  vlag  voorziet  in  hetzelfde  gedrag  als  MAP_SHARED behalve dat MAP_SHARED
              uit-leggingen negeert bij onbekende vlaggen in  vlaggen.  Wanneer  daarentegen  een
              uit-legging  wordt  gemaakt  met  MAP_SHARED_VALIDATE, dan verifieert de  kernel of
              alle doorgegeven vlaggen bekend  zijn  en  stopt  met  het  aanmaken  met  de  fout
              EOPNOTSUPP voor onbekende vlaggen.  Het uit-legging type is ook vereist om in staat
              te zijn om sommige uit-leggings vlaggen te gebruiken (b.v., MAP_SYNC).

       MAP_PRIVATE
              Maakt een kopiëren-op-schrijven uit-legging aan. Updates aan  de  uit-legging  zijn
              niet zichtbaar voor andere processen die hetzelfde bestand bewerken, en worden niet
              doorgegeven aan het onderliggende bestand. Niet gespecificeerd is of  veranderingen
              gemaakt  aan  het  bestand  na  de mmap() aanroep zichtbaar zijn in de uit-leggings
              regio.

       Zowel MAP_SHARED  en  MAP_PRIVATE  worden  beschreven  in  POSIX.1-2001  en  POSIX.1-2008.
       MAP_SHARED_VALIDATE is een Linux uitbreiding.

       In aanvulling, nul of meer van de volgende waarden kunnen worden geOF´ed in vlaggen:

       MAP_32BIT (sinds Linux 2.4.20, 2.6)
              Plaats de uit-legging in de eerste 2 gigabyte van de proces adres ruimte. Deze vlag
              wordt  alleen  op  een  x86-64  ondersteund,  voor  64-bit  programma´s.  Hij  werd
              toegevoegd om thread stacks toe te staan ergens in de eerste 2 GB van het geheugen,
              om zo de context-switch prestaties van de eerste 64-bit processoren te  verbeteren.
              Moderne  x86-64 processoren hebben dit prestatie probleem niet meer, daarom is deze
              vlag op die systemen niet  meer  nodig.  De  MAP_32BIT  vlag  wordt  genegeerd  als
              MAP_FIXED is gezet.

       MAP_ANON
              Synoniem   voor   MAP_ANONYMOUS;   voorzien   voor   overdraagbaarheid  met  andere
              implementaties.

       MAP_ANONYMOUS
              De uit-legging wordt niet ondersteund door enig bestand; zijn inhoud wordt  op  nul
              geïnitialiseerd.  Het  bi  argument  wordt genegeerd; hoewel sommige implementaties
              vereisen dat bi -1 is indien de  MAP_ANONYMOUS (of MAP_ANON)   werd  opgegeven,  en
              overdraagbare  applicaties  zouden  die  moeten zeker stellen. Het positie argument
              moet nul zijn. Het gebruik van MAP_ANONYMOUS in  verbinding  met  MAP_SHARED  wordt
              alleen ondersteund op Linux vanaf kernel 2.4.

       MAP_DENYWRITE
              Deze  vlag  wordt  genegeerd.  (Lang geleden—Linux 2.0 en eerder—it signaleerde dat
              pogingen om te schrijven naar het onderliggende bestand zouden falen  met  ETXTBSY.
              Maar dit bleek een bron voor denial-of-service aanvallen.)

       MAP_EXECUTABLE
              Deze vlag word genegeerd.

       MAP_FILE
              Overdraagbaarheid vlag. Genegeerd.

       MAP_FIXED
              Interpreteer  start  niet  als  een hint: plaats de uit-legging exact op dit adres.
              start moet juist uitgelijnd zij: voor de meeste architecturen is een  meervoud  van
              de  pagina  grootte voldoende; hoewel sommige architecturen additionele beperkingen
              kunnen vereisen. Als de geheugen regio opgegeven  door  start  en  lengte  pagina´s
              overlapt  van  enige bestaande uit-legging(en), dan wordt het overlappende deel van
              de bestaande uit-legging  verworpen.  Als  het  opgegeven  adres  niet  kan  worden
              gebruikt dan zal mmap() falen.

              Software  die  pretendeert  overdraagbaar  te zijn zou de MAP_FIXED vlag zorgvuldig
              moeten gebruiken, bedenk dat de exacte layout van de uit-legging van een proces erg
              mag  veranderen  tussen  kernel  versies,  C  bibliotheek versie en versies van het
              besturingssysteem. Lees de discussie over deze vlag in NOTITIES!

       MAP_FIXED_NOREPLACE (sinds Linux 4.17)
              Deze vlag voorziet in gedrag dat vergelijkbaar is  met  MAP_FIXED  rekeninghoudende
              met  de  start  handhaving,  maar  verschilt erin dat MAP_FIXED_NOREPLACE nooit een
              reeds bestaand uit-gelegd gebied vervuild. Indien het gevraagde  gebied  botst  met
              een bestaande uit-legging, dan faalt deze aanroep met de fout EEXIST. Deze vlag kan
              daarom worden gebruikt om op een atomaire manier (met het oog op andere threads) te
              proberen  om  een  adres  bereik  uit te leggen: een thread zal slagen; alle andere
              zullen een fout rapporteren.

              Let op dat oudere kernels die de MAP_FIXED_NOREPLACE  vlag niet herkennen (bij  het
              detecteren  van  een  reeds  bestaande  uit-legging)  terug  zullen  vallen  op een
              "niet-MAP_FIXED" type of behavior: zij zullen een adres  teruggeven  dat  verschilt
              van het gevraagde adres. Daarom moet overdraagbare software altijd het teruggegeven
              adres moeten vergelijken met het gevraagde adres.

       MAP_GROWSDOWN
              Deze vlag wordt gebruikt door stacks. Hij geeft aan het virtuele  geheugen  systeem
              in  de  kernel  aan  dat  de  uit-legging  neerwaarts moet uitgebreid worden in het
              geheugen. Het teruggegeven adres is een pagina lager dan de het geheugen gebied dat
              daadwerkelijk  is  aangemaakt  in  de  virtuele  adres  ruimte  van het proces. Het
              aanraken van een adres in de "bewaakte" pagina onder de  uit-legging  zal  er  voor
              zorgen  dat  de  uit-legging  met een pagina groeit. Deze groei kan worden herhaald
              totdat de uit-legging groeit tot in een pagina aan de hoge  kant  van  de  volgende
              lagere  uit-legging, waardoor het aanraken van een "bewaakte" pagina zal resulteren
              in een SIGSEGV signaal.

       MAP_HUGETLB (sinds Linux 2.6.32)
              Ken de uit-legging toe gebruik makend van "enorme" pagina´s. Zie het  Linux  kernel
              broncode    bestand     Documentation/admin-guide/mm/hugetlbpage.rst    voor   meer
              informatie, en ook NOTITIES, hieronder.

       MAP_HUGE_2MB, MAP_HUGE_1GB (sinds Linux 3.8)
              Gebruikt in combinatie met MAP_HUGETLB om  alternatieve  hugetlb  pagina  maten  te
              selecteren  (respectievelijk 2 MB en 1 GB)  op systemen die meerdere hugetlb pagina
              maten ondersteunen.

              In het algemeen kan de gewenste enorme pagina worden geconfigureerd door  op  basis
              van  de  2-logaritme  van  de  gewenste pagina grootte op de zes bits op de positie
              MAP_HUGE_SHIFT. (Een nul-waarde in dit veld voorziet in de standaard enorme  pagina
              grootte;  de standaard enorme pagina grootte kan worden ontdekt door middel van het
              Hugepagesize veld  aangeduid in /proc/meminfo.)  Daarom worden de  twee  constanten
              hierboven gedefinieerd als:

                  #define MAP_HUGE_2MB    (21 << MAP_HUGE_SHIFT)
                  #define MAP_HUGE_1GB    (30 << MAP_HUGE_SHIFT)

              Het  bereik  van de enorme pagina maten die ondersteund worden door het systeem kan
              worden ontdekt door het oplijsten van de submappen in /sys/kernel/mm/hugepages.

       MAP_LOCKED (sinds Linux 2.5.37)
              Markeer de uit-gelegde regio op  dezelfde  manier  opgesloten  als  mlock(2).  Deze
              implementatie  zal  proberen het gehele gebied te beschrijven (voorgegeven) maar de
              mmap()  aanroep faalt niet met ENOMEM als dit mislukt. Daarom  kunnen  later  forse
              fouten  optreden.  Daarom  is  de  semantiek  niet zo sterk als mlock(2).  Men moet
              mmap()  en mlock(2) gebruiken wanneer forse fouten niet geaccepteerd kunnen  worden
              na  de  initialisatie  van  de  uit-legging.  De MAP_LOCKED vlag wordt genegeerd in
              oudere kernels.

       MAP_NONBLOCK (sinds Linux 2.5.46)
              Deze vlag is alleen van  betekenis  in  combinatie  met  MAP_POPULATE.   Voer  geen
              read-ahead  uit: creëer pagina tabel ingangen alleen voor pagina´s die al  aanwezig
              zijn in RAM.  Vanaf Linux 2.6.23 zorgt deze vlag ervoor dat MAP_POPULATE niks doet.
              Op  een  dag  kan  de  combinatie  van  MAP_POPULATE en MAP_NONBLOCK opnieuw worden
              geïmplementeerd.

       MAP_NORESERVE
              Reserveer geen swap ruimte voor deze  uit-legging.  Indien  de  swap  ruimte  wordt
              gereserveerd,  dan  moet  men  garanderen  dat  het  mogelijk  is de uit-legging te
              modificeren. Indien swap ruimte niet gereserveerd werd  dan  zou  met  een  SIGSEGV
              kunnen  krijgen  bij het schrijven als geen fysiek geheugen beschikbaar is. Zie ook
              de discussie  over  het  bestand  /proc/sys/vm/overcommit_memory  in  proc(5).   In
              kernels voor 2.6, had deze vlag alleen effectin private schrijfbare uit-leggingen.

       MAP_POPULATE (sinds Linux 2.5.46)
              Gebruik  (voorgegeven)  pagina  tabellen  voor een uit-legging. Dit veroorzaakt het
              voor-lezen van een  bestand  voor  een  bestands  uit-legging.  Het  helpt  om  het
              blokkeren van pagina fouten nadien te reduceren. De mmap() aanroep mislukt niet als
              de uit-legging niet kan worden voorgegeven (bij voorbeeld,  vanwege  limitaties  op
              het   aantal   uit-gelegde  enorme  pagina´s  bij  het  gebruik  van  MAP_HUGETLB).
              MAP_POPULATE wordt alleen ondersteund  voor  private  uit-leggingen    vanaf  Linux
              2.6.23.

       MAP_STACK (sinds Linux 2.6.27)
              Wijs  de  uit-legging  toe  aan een adres dat geschikt is voor een proces of thread
              stack.

              Deze vlag doet momenteel niks op Linux. Hoewel, door deze vlag te gebruiken  kunnen
              applicaties zeker stellen dat zij transparant ondersteund worden zodra deze vlag in
              de toekomst ondersteund wordt. Dan zal hij worden gebruikt in  de  glibc  threading
              implementatie   om   toe  te  staan  dat  sommige  architecturen  (later)  speciale
              behandeling voor stack toewijzingen vereisen. En  andere  reden  om  deze  vlag  te
              gebruiken  is overdraagbaarheid: MAP_STACK bestaat (en heeft een effect) op sommige
              andere systemen (b.v. sommige van de BSDs).

       MAP_SYNC (sinds Linux 4.15)
              Deze vlag is alleen  beschikbaar  bij  het  MAP_SHARED_VALIDATE  uit-legging  type;
              uit-leggingen  van  het  MAP_SHARED  type negeren deze vlag stilzwijgend. Deze vlag
              wordt alleen ondersteund op bestanden  die  DAX  (direct  uit-leggen  van  blijvend
              geheugen) ondersteunen. Voor andere bestanden, zal het aanmaken van een uit-legging
              met deze vlag resulteren in een EOPNOTSUPP fout.

              Gedeelde bestands uit-leggingen met deze vlag voorzien in de garantie  dat  terwijl
              sommig  geheugen  schrijfbaar  is uit-gelegd in de adres ruimte van dat proces, het
              zichtbaar zal zijn in hetzelfde  bestand  op  dezelfde  positie,  zelfs  nadat  het
              systeem  is gecrasht of is geherstart. In combinatie met het gebruik van de gepaste
              CPU instructies, worden gebruikers van deze  uit-leggingen  voorzien  in  een  meer
              efficiënte manier van het persistent maken van de data wijzigingen.

       MAP_UNINITIALIZED (vanaf Linux 2.6.33)
              Wis  anonieme  pagina´s  niet.  Deze vlag is bedoeld om prestaties te verbeteren op
              embedded  apparaten.  Deze  vlag  wordt  alleen  gebruikt  indien  de  kernel  werd
              geconfigureerd  met de CONFIG_MMAP_ALLOW_UNINITIALIZED optie. Vanwege de veiligheid
              implicaties  wordt  deze  optie  alleen  aangezet  op  embedded  apparaten  (m.a.w.
              apparaten waarin met complete controle heeft over de inhoud van het geheugen.

       Van  de  bovenstaande  vlaggen  is  alleen  MAP_FIXED  gespecificeerd  in  POSIX.1-2001 en
       POSIX.1-2008.  Hoewel de meeste systemen ook MAP_ANONYMOUS ondersteunen (of zijn  synoniem
       MAP_ANON).

   munmap()
       De  mummap() systeem aanroep verwijderd de uit-leggingen voor het aangegeven adres gebied,
       en zorgt er voor dat verdere referenties naar adressen in het gebied niet-geldige geheugen
       referenties op leveren. Het gebied wordt ook automatisch ont-uit-gelegd wanneer het proces
       wordt beëindigt. Aan de andere kant zal het sluiten van de  bestandsindicator  het  gebied
       niet on-uitleggen.

       Het  adres  start moet een meervoud zijn van de pagina grootte (maar lengte hoeft dat niet
       te  zijn).  Alle  pagina´s  die  een  deel  van  het  aangegeven  gebied  bevatten  worden
       ont-uit-gelegd,  en  volgende referenties naar deze pagina´s zullen een SIGSEGV opleveren.
       Het is geen fout als het aangegeven gebied enige uit-gelegde pagina´s bevat.

EIND WAARDE

       Bij succes geeft mmap() een pointer naar een uit-gelegd gebied terug. Bij een fout,  wordt
       de  waarde  MAP_FAILED (dat is, (void *) -1)  terug gegeven, en wordt errno overeenkomstig
       gezet.

       Bij succes geeft  munmap()  0  terug.  Bij  falen  geeft  het  -1  terug  en  errno  wordt
       overeenkomstig gezet (waarschijnlijk op EINVAL).

FOUTEN

       EACCES Een  bestands  indicator  wijst  naar  een  niet-regulier  bestand. Of een bestands
              uit-legging werd gevraagd, maar bi is niet open  voor  lezen.  Of  MAP_SHARED  werd
              gevraagd  en  PROT_WRITE  is  gezet,  maar bi is niet open in schrijf/lees (O_RDWR)
              modus.  Of PROT_WRITE werd gezet, maar het bestand is alleen-achteraan-toevoegen.

       EAGAIN Het bestand was vergrendeld of teveel geheugen was vergrendeld (zie setrlimit(2)).

       EBADF  bi is geen geldige bestandindicator (en MAP_ANONYMOUS was niet gezet).

       EEXIST MAP_FIXED_NOREPLACE werd specified in vlaggen, en het bereik bedekt door  start and
              lengte botst met een bestand

       EINVAL We  houden  niet  van  start  of  lengte  of positie (ze zijn b.v. te groot of niet
              uitgelijnd op een pagina grens.

       EINVAL (sinds Linux 2.6.12)  lengte was 0.

       EINVAL vlaggen bevatte noch MAP_PRIVATE, MAP_SHARED, of MAP_SHARED_VALIDATE.

       ENFILE De grens aan het aantal open bestanden van het systeem is bereikt.

       ENODEV Het onderliggende bestandssysteem van het opgegeven bestand ondersteund  uit-leggen
              van het geheugen niet.

       ENOMEM Geen geheugen beschikbaar.

       ENOMEM Het maximaal aantal uit-leggingen zou zijn overschreden. Deze fout kan ook optreden
              voor munmap() bij het on-uitleggen van een regio in het midden  van  een  bestaande
              uit-legging,  omdat  dit resulteert in twee kleinere uit-leggingen aan beide zijden
              van de regio die ont-uit-gelegd wordt.

       ENOMEM (vanaf Linux 4.7) De proces limiet RLIMIT_DATA beschreven in getrlimit(2), zou zijn
              overschreden.

       EOVERFLOW
              Op  32-bit architecturen samen met de grote bestand uitbreiding (m.a.w. gebruik van
              64-bit off_t): het aantal pagina´s gebruikt voor lengte plus  het  aantal  pagina´s
              gebruikt voor positie zou de unsigned long (32 bits) overlopen.

       EPERM  Het  prot  argument  vraag  om PROT_EXEC maar het uitgelegde gebied behoort bij een
              bestand op een bestandssysteem dat als niet-executeerbaar gekoppeld is.

       EPERM  De operatie werd voorkomen door een bestandszegel; zie fcntl(2).

       EPERM  De MAP_HUGETLB vlag werd opgegeven, maar de aanroeper was niet gerechtigd (had niet
              de  CAP_IPC_LOCK capaciteit)  en is geen lid van de sysctl_hugetlb_shm_group groep;
              zie de beschrijving van /proc/sys/vm/sysctl_hugetlb_shm_group in

       ETXTBSY
              MAP_DENYWRITE werd  gezet  maar  het  voorwerp  opgegeven  door  bi  is  open  voor
              schrijven.

       Het gebruik van een uit-gelegde regio kan resulteren in deze signalen:

       SIGSEGV
              Poging om te schrijven in een als alleen-lezen uit-gelegd gebied.

       SIGBUS Een  toegangspoging naar een pagina van de buffer die verder ligt dan het einde van
              het in kaart gebrachte bestand. Voor een uitleg van de behandeling van de bytes  in
              de  pagina die overeenkomt met het einde van een in kaart gebracht bestand die geen
              meervoud is van de pagina grootte, zie NOTITIES.

ATTRIBUTEN

       Voor een uitleg van de termen in deze sectie, zie attributes(7).

       ┌───────────────────────────────────────────────────────────┬───────────────────┬─────────┐
       │InterfaceAttribuutWaarde  │
       ├───────────────────────────────────────────────────────────┼───────────────────┼─────────┤
       │mmap(), munmap()                                           │ Thread veiligheid │ MT-Safe │
       └───────────────────────────────────────────────────────────┴───────────────────┴─────────┘

VOLDOET AAN

       POSIX.1-2001, POSIX.1-2008, SVr4, 4.4BSD.

       Op  POSIX  systemen   waarop  mmap(),  msync(2),  en   munmap()   beschikbaar   zijn,   is
       _POSIX_MAPPED_FILES  gedefinieerd  in  <unistd.h>  met  een waarde groter dan 0.  (Zie ook
       sysconf(3).)

OPMERKINGEN

       Door mmap()  in  kaart  gebracht  geheugen  wordt  bewaard  langs  fork(2),  met  dezelfde
       attributen.

       Een  bestand  is  uit-gelegd in meervouden van de pagina grootte. Van een bestand dat geen
       meervoud van de pagina grootte is, worden de resterende bytes in de  gedeeltelijke  pagina
       aan  het einde van de uit-legging op nul gezet tijdens het uit-leggen, en modificaties aan
       die regio worden niet geschreven naar het bestand. Het effect van de  verandering  van  de
       grootte  van het onderliggende bestand van een uit-legging op de pagina´s die overeenkomen
       met toegevoegde of verwijderde regio´s van dat bestand is niet gespecificeerd.

       Op sommige hardware architecturen (b.v. i386), impliceert  PROT_WRITE  PROT_READ.  Het  is
       architectuur  afhankelijk  of  PROT_READ  al  dan niet PROT_EXEC impliceert. Overdraagbare
       programma´s zouden altijd PROT_EXEC moeten zetten als ze van plan  zijn  om  code  uit  te
       voeren in het nieuwe overzicht.

       De  overdraagbare manier om uit-leggingen te maken is door start als 0 (NULL) op te geven,
       en MAP_FIXED weg te laten uit vlaggen. In dat geval kiest het systeem het  adres  voor  de
       uit-legging; dit adres wordt zodanig gekozen dat het niet conflicteert met enige bestaande
       uit-legging, en zal niet 0 zijn. Als de MAP_FIXED flag  werd  opgegeven,  en  start  is  0
       (NULL), dan zal het uit-gelegde adres 0 (NULL) zijn.

       Bepaalde  vlaggen  constanten  zijn  alleen gedefinieerd als bepaalde feature test macro´s
       werden gedefinieerd (mogelijk standaard): _DEFAULT_SOURCE met  glibc  2.19  of  later;  of
       _BSD_SOURCE  of _SVID_SOURCE in glibc 2.19 en eerder.  (Gebruik van _GNU_SOURCE is genoeg,
       deze macro specifiek vereisen  zou meer logisch geweest zijn,  omdat  deze  vlaggen  allen
       Linux-specifiek  zijn.)   De  relevante  vlaggen  zijn:  MAP_32BIT, MAP_ANONYMOUS (en zijn
       synoniem MAP_ANON), MAP_DENYWRITE, MAP_EXECUTABLE, MAP_FILE,  MAP_GROWSDOWN,  MAP_HUGETLB,
       MAP_LOCKED, MAP_NONBLOCK, MAP_NORESERVE, MAP_POPULATE, en MAP_STACK.

       Een  applicatie  kan  bepalen  welke  pagina´s  van  een  uit-legging  aanwezig zijn in de
       buffer/pagina cache door mincore(2) te gebruiken.

   Gebruik MAP_FIXED veilig
       Het enige veilige gebruik van MAP_FIXED is  indien  het  adresbereik  gespecificeerd  door
       start  en  lengte  voordien  gereserveerd  werd door een andere uit-legging; anders is het
       gebruik van MAP_FIXED foutgevoelig om het bestaande uit-leggingen  geforceerd  verwijderd,
       hetgeen  het  mogelijk  maakt  voor  een multithreaded proces om zijn eigen adresruimte te
       corrumperen.

       Bijvoorbeeld, neem aan dat thread A door /proc/<pid>/maps loopt om de niet gebruikte adres
       ruimte  te  vinden  die  het  kan uit-leggen door MAP_FIXED te gebruiken, terwijl thread B
       tegelijkertijd een deel of alles van dezelfde adres ruimte acquireert.  Wanneer nu  thread
       A  vervolgens  mmap(MAP_FIXED) gebruikt dan zal deze effectief de uit-legging die thread B
       maakte kapot maken. In dit scenario zou thread B niet direct een uit-legging moeten maken;
       eenvoudig  weg  het aanroepen van een bibliotheek functie die, intern, dlopen(3) gebruikt,
       om een andere gedeelde bibliotheek te laden, is voldoende. De  dlopen(3)  aanroep  zal  de
       bibliotheek  op  de  adresruimte  van  het  proces  uit-leggen.  Bovendien  kan bijna elke
       bibliotheek aanroep worden geïmplementeerd op een manier die geheugen uit-legging toevoegt
       aan  de  adres  ruimte,  ofwel  met  deze  techniek,  ofwel  door eenvoudigweg geheugen te
       alloceren.  Voorbeelden hiervan zijn onder anderen brk(2),  malloc(3),  pthread_create(3),
       en de PAM bibliotheken ⟨http://www.linux-pam.org⟩.

       Vanaf  Linux 4.17 kan een multithreaded programma de MAP_FIXED_NOREPLACE vlaggen gebruiken
       om het hierboven beschreven gevaar te voorkomen bij het aanmaken van  een  uit-legging  op
       een vast adres dat werd gereserveerd door een bestaande uit-legging.

   Tijdstempel veranderingen voor bestand-backed uit-leggingen
       Voor  bestand-backed  uit-leggingen,  mag  het  st_atime  veld van het uit-gelegde bestand
       worden  geüpdatet  met  elk  tijdstip  tussen  de  mmap()  en  de  daarmee  overeenkomende
       ont-uit-legging; de eerste referentie naar een uit-gelegde pagina zal het veld updaten als
       het al niet geüpdatet was.

       De st_ctime en st_mtime velden voor een uit-gelegd bestand met  PROT_WRITE  en  MAP_SHARED
       worden  geüpdatet  na  het  schrijven  naar  een  uit-gelegde  regio, en voor een volgende
       msync(2)  met de MS_SYNC of MS_ASYNC vlag, als er een optreed.

   Enorme pagina (ENORME TLB) uit-leggingen.
       Voor uit-leggingen die enorme pagina´s gebruiken, verschillen de eisen voor de  argumenten
       van  mmap()   en  munmap()  iets  van  de eisen voor de uit-leggingen die de eigen systeem
       pagina grootte gebruiken.

       Voor mmap(), moet positie en lengte  een  meervoud  van  de  onderliggende  enorme  pagina
       grootte  zijn.  Het  systeem lijnt automatisch lengte op een meervoud van de onderliggende
       enorme pagina grootte aan.

       Voor munmap(), start en lengte moeten beiden een  meervoud  van  de  onderliggende  enorme
       pagina grootte zijn.

   C library/kernel verschillen
       Deze  pagina  beschrijft  het  interface  waarin  glibc  mmap() omwikkel functie voorziet.
       Origineel riep deze functie een systeem aanroep aan van dezelfde naam. Vanaf kernel 2.4 is
       deze systeem aanroep opgevolgd door mmap2(2), en momenteel roept de glibc mmap()  omwikkel
       functie  mmap2(2)  met een geschikt aangepaste waarde voor positie.

BUGS

       Op Linux zijn er geen  garanties  zoals  die,  die  hierboven  gesuggereerd  werden  onder
       MAP_NORESERVE.   Standaard  kan  elke  proces  op  elke  moment worden beëindigd zodra het
       geheugen van het systeem vol raakt.

       In kernels vóór 2.6.7, heeft de MAP_POPULATE vlag alleen effect als  prot  werd  opgegeven
       als PROT_NONE

       SUSv3  specificeert  dat  mmap()   moet  falen  als  length 0 is.  Echter, in kernels voor
       2.6.12, was mmap()  succesvol in dit geval: er werd geen uit-legging gemaakt en de aanroep
       retourneerde  adres.   Vanaf  kernel 2.6.12, faalt mmap()  in dit geval met de foutmelding
       EINVAL.

       POSIX specificeert dat het systeem altijd enige gedeeltelijke pagina vult met  nullen  aan
       het  einde  van  een  object  en  dat het systeem nooit enige wijziging van het object zal
       schrijven voorbij zijn einde. Wanneer u data schrijft naar zo´n  gedeeltelijke  pagina  na
       het  einde  van een object op Linux, dan zal deze data op de pagina cache aanwezig blijven
       zelfs nadat het bestand werd gesloten en ont-uit-gelegd en zelfs als de  data  nooit  werd
       geschreven naar het bestand zelf, volgende uit-leggingen kunnen de gewijzigde inhoud zien.
       In sommige gevallen kan dit worden opgelost door het aanroepen van msync(2)   voordat  het
       ont-uit-leggen  plaats  vind;  hoewel dit niet werkt voor  tmpfs(5), (b.v. bij het gebruik
       van  het  van  het   POSIX   gedeeld   geheugen   interface,   zoals   gedocumenteerd   in
       shm_overview(7)).

VOORBEELDEN

       Het volgende programma schrijft delen van het bestand, opgegeven in het eerste argument op
       de commando regel, naar standaard uitvoer. Het bereik van  de  te  schrijven  bytes  wordt
       bepaald  door  middel  van  de  positie en lengte waarden opgegeven in het tweede en derde
       argument op de commando regel. Het programma maakt een geheugen  uit-legging  aan  van  de
       vereiste  pagina´s van het bestand en gebruikt vervolgens write(2) om de gewenste bytes te
       tonen.

   Programma bron
       #include <sys/mman.h>
       #include <sys/stat.h>
       #include <fcntl.h>
       #include <stdio.h>
       #include <stdlib.h>
       #include <unistd.h>

       #define handle_error(msg) \
           do { perror(msg); exit(EXIT_FAILURE); } while (0)

       int
       main(int argc, char *argv[])
       {
           char *addr;
           int fd;
           struct stat sb;
           off_t offset, pa_offset;
           size_t length;
           ssize_t s;

           if (argc < 3 || argc > 4) {
               fprintf(stderr, "%s file offset [length]\n", argv[0]);
               exit(EXIT_FAILURE);
           }

           fd = open(argv[1], O_RDONLY);
           if (fd == -1)
               handle_error("open");

           if (fstat(fd, &sb) == -1)           /* om bestand grootte te verkrijgen */
               handle_error("fstat");

           offset = atoi(argv[2]);
           pa_offset = offset & ~(sysconf(_SC_PAGE_SIZE) - 1);
               /* positie voor mmap() moet uitgelijnd zijn op een pagina */

           if (offset >= sb.st_size) {
               fprintf(stderr, "positie voorbij einde van het bestand\n");
               exit(EXIT_FAILURE);
           }

           if (argc == 4) {
               length = atoi(argv[3]);
               if (offset + length > sb.st_size)
                   length = sb.st_size - offset;
                       /* Kan geen bytes tonen voorbij einde van het bestand */

           } else {    /* No length arg ==> display to end of file */
               length = sb.st_size - offset;
           }

           start = mmap(NULL, lengte + offset - pa_offset, PROT_READ,
                       MAP_PRIVATE, fd, pa_offset);
           if (start == MAP_FAILED)
               handle_error("mmap");

           s = write(STDOUT_FILENO, start + offset - pa_offset, lengte);
           if (s != lengte) {
               if (s == -1)
                   handle_error("write");

               fprintf(stderr, "partial write");
               exit(EXIT_FAILURE);
           }

           munmap(start, lengte + offset - pa_offset);
           close(fd);

           exit(EXIT_SUCCESS);
       }

ZIE OOK

       ftruncate(2),   getpagesize(2),   memfd_create(2),   mincore(2),    mlock(2),    mmap2(2),
       mprotect(2),    mremap(2),    msync(2),   remap_file_pages(2),   setrlimit(2),   shmat(2),
       userfaultfd(2), shm_open(3), shm_overview(7)

       De   beschrijving   van   de   volgende   bestanden    in    proc(5):    /proc/[pid]/maps,
       /proc/[pid]/map_files, en /proc/[pid]/smaps.

       B.O. Gallmeister, POSIX.4, O'Reilly, pp. 128–129 en 389–391.

COLOFON

       Deze   pagina  is  onderdeel  van  release  5.13  van  het  Linux  man-pages-project.  Een
       beschrijving van het project, informatie over het melden van bugs en  de  nieuwste  versie
       van deze pagina zijn op https://www.kernel.org/doc/man-pages/ te vinden.

VERTALING

       De   Nederlandse   vertaling   van  deze  handleiding  is  geschreven  door  Jos  Boersema
       <joshb@xs4all.nl>, Mario  Blättermann  <mario.blaettermann@gmail.com>  en  Luc  Castermans
       <luc.castermans@gmail.com>

       Deze  vertaling  is  vrije  documentatie;  lees  de  GNU  General Public License Version 3
       ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ of later over de Copyright-voorwaarden. Er  is
       geen AANSPRAKELIJKHEID.

       Indien  U  fouten  in  de vertaling van deze handleiding zou vinden, stuur een e-mail naar
       ⟨debian-l10n-dutch@lists.debian.org⟩.