.\" -*- coding: UTF-8 -*-
'\" t
.\" Copyright (C) 1996 Andries Brouwer <aeb@cwi.nl>
.\" and Copyright (C) 2006, 2007 Michael Kerrisk <mtk.manpages@gmail.com>
.\"
.\" SPDX-License-Identifier: Linux-man-pages-copyleft
.\"
.\" Modified 1997-01-31 by Eric S. Raymond <esr@thyrsus.com>
.\" Modified 2000-03-25 by Jim Van Zandt <jrv@vanzandt.mv.com>
.\" Modified 2001-10-04 by John Levon <moz@compsoc.man.ac.uk>
.\" Modified 2003-02-02 by Andi Kleen <ak@muc.de>
.\" Modified 2003-05-21 by Michael Kerrisk <mtk.manpages@gmail.com>
.\"	MAP_LOCKED works from Linux 2.5.37
.\" Modified 2004-06-17 by Michael Kerrisk <mtk.manpages@gmail.com>
.\" Modified 2004-09-11 by aeb
.\" Modified 2004-12-08, from Eric Estievenart <eric.estievenart@free.fr>
.\" Modified 2004-12-08, mtk, formatting tidy-ups
.\" Modified 2006-12-04, mtk, various parts rewritten
.\" 2007-07-10, mtk, Added an example program.
.\" 2008-11-18, mtk, document MAP_STACK
.\"
.\"*******************************************************************
.\"
.\" This file was generated with po4a. Translate the source file.
.\"
.\"*******************************************************************
.TH mmap 2 "15 czerwca 2024 r." "Linux man\-pages 6.9.1" 
.SH NAZWA
mmap, munmap \- mapuje lub usuwa mapowanie plików lub urządzeń w pamięci
.SH BIBLIOTEKA
Standardowa biblioteka C (\fIlibc\fP, \fI\-lc\fP)
.SH SKŁADNIA
.nf
\fB#include <sys/mman.h>\fP
.P
\fBvoid *mmap(void \fP\fIaddr\fP\fB[.\fP\fIlength\fP\fB], size_t \fP\fIlength\fP\fB, int \fP\fIprot\fP\fB, int \fP\fIflags\fP\fB,\fP
\fB           int \fP\fIfd\fP\fB, off_t \fP\fIoffset\fP\fB);\fP
\fBint munmap(void \fP\fIaddr\fP\fB[.\fP\fIlength\fP\fB], size_t \fP\fIlength\fP\fB);\fP
.fi
.P
Informacje o wymaganych makrach sprawdzania cech znajdują się w rozdziale
UWAGI.
.SH OPIS
\fBmmap\fP() tworzy nowe mapowanie w wirtualnej przestrzeni adresowej procesu
wywołującego. Początkowy adres nowego mapowania podaje się w
\fIaddr\fP. Argument \fIlength\fP określa długość mapowania (musi być ono większe
niż 0).
.P
.\" Before Linux 2.6.24, the address was rounded up to the next page
.\" boundary; since Linux 2.6.24, it is rounded down!
Jeśli \fIaddr\fP wynosi NULL, to jądro wybiera (wyrównany do strony) adres, na
którym utworzy mapowanie; jest to najbardziej przenośna metoda tworzenia
nowych mapowań. Jeśli \fIaddr\fP nie wynosi NULL, to jądro traktuje go jako
wskazówkę na temat miejsca umieszczenia mapowania; w Linuksie, jądro
wybierze najbliższą granicę strony (jednak będzie ona zawsze równa lub
większa wartości określonej w \fI/proc/sys/vm/mmap_min_addr\fP) i spróbuje
utworzyć tu nowe mapowanie. Jeśli inne mapowanie już tu istnieje, jądro
wybierze nowy adres, który może, lecz nie musi, zależeć od wskazówki. Adres
nowego mapowania jest zwracany jako wynik wywołania.
.P
Zawartość mapowania pliku (w przeciwieństwie do mapowania anonimowego;
zob. \fBMAP_ANONYMOUS\fP poniżej) jest inicjowana za pomocą \fIlength\fP bajtów
zaczynających się w przesunięciu \fIoffset\fP w pliku (lub innym obiekcie), do
którego odnosi się deskryptor pliku \fIfd\fP. \fIoffset\fP musi być
wielokrotnością rozmiaru strony, jaki zwraca \fIsysconf(_SC_PAGE_SIZE)\fP.
.P
Po powrocie wywołania \fBmmap\fP(), deskryptor pliku \fIfd\fP może być
niezwłocznie zamknięty, nie unieważniając mapowania.
.P
Argument \fIprot\fP opisuje oczekiwany sposób ochrony pamięci mapowania (i nie
może być sprzeczny z trybem otwarcia pliku). Może on być równy \fBPROT_NONE\fP
lub może być sumą bitową (OR) jednego lub więcej spośród innych znaczników
PROT_*.
.TP  1.1i
\fBPROT_EXEC\fP
Strony mogą być wykonywane.
.TP 
\fBPROT_READ\fP
Strony mogą być odczytywane.
.TP 
\fBPROT_WRITE\fP
Strony mogą być zapisywane.
.TP 
\fBPROT_NONE\fP
.\"
Strony mogą nie być dostępne.
.SS "Argument flags"
Argument \fIflags\fP określa, czy aktualizacje mapowania są widoczne dla innych
procesów mapowanych do tego samego miejsca i czy aktualizacje są przenoszone
na sam plik. To zachowanie zależy od podanej, dokładnie jednej z poniższych
wartości \fIflags\fP:
.TP 
\fBMAP_SHARED\fP
Dzieli zadane mapowanie. Aktualizacje mapowania są widoczne dla innych
procesów mapowanych do tego samego miejsca i (w przypadku mapowań opartych
na pliku) są przenoszone do samego pliku (aby kontrolować dokładnie, kiedy
aktualizacje są przenoszone na sam plik, konieczne jest użycie \fBmsync\fP(2)).
.TP 
\fBMAP_SHARED_VALIDATE\fP (od Linuksa 4.15)
Znacznik zapewnia takie same zachowanie jak \fBMAP_SHARED\fP z tą różnicą, że
mapowania \fBMAP_SHARED\fP ignorują nieznane znaczniki we \fIflags\fP. Przy
tworzeniu mapowań z użyciem \fBMAP_SHARED_VALIDATE\fP, jądro sprawdza
natomiast, czy wszystkie przekazane znaczniki są znane i odmawia mapowania z
błędem \fBEOPNOTSUPP\fP, jeśli wystąpią nieznane znaczniki. Ten typ mapowania
jest również wymagany, aby móc korzystać z niektórych znaczników mapowań
(np. \fBMAP_SYNC\fP).
.TP 
\fBMAP_PRIVATE\fP
Tworzy prywatne mapowanie, typu \[Bq]kopiowanie podczas
zapisu\[rq]. Aktualizacje mapowania nie są widoczne dla innych procesów
mapujących ten sam plik i nie są przenoszone na sam plik. Nie jest
określone, czy zmiany zawartości pliku wykonane po wywołaniu \fBmmap\fP() będą
uwidocznione w mapowanym obszarze.
.P
\fBMAP_SHARED\fP i \fBMAP_PRIVATE\fP są opisane w POSIX.1\-2001 i POSIX.1\-2008.
\fBMAP_SHARED_VALIDATE\fP jest rozszerzeniem Linuksa.
.P
Ponadto, zero lub więcej poniższych wartości można zsumować bitowo (OR) we
\fIflags\fP:
.TP 
\fBMAP_32BIT\fP (od Linuksa 2.4.20, 2.6)
.\" See http://lwn.net/Articles/294642 "Tangled up in threads", 19 Aug 08
Umieszcza mapowanie w pierwszych 2 gigabajtach przestrzeni adresowej
procesu. Znacznik jest obsługiwany tylko na architekturze x86\-64, w
przypadku programów 64\-bitowych. Znacznik dodano, aby pozwolić stosom wątków
na zaalokowanie w pierwszych 2\ GB pamięci, co usprawniało wydajność
przełączania kontekstów na pewnych wczesnych procesorach
64\-bitowych. Współczesne procesory x86\-64 nie mają takiego problemu z
wydajnością, zatem znacznik ten nie jest wymagany na tych
systemach. Znacznik \fBMAP_32BIT\fP jest ignorowany, gdy ustawiony jest
\fBMAP_FIXED\fP.
.TP 
\fBMAP_ANON\fP
Równoważne \fBMAP_ANONYMOUS\fP; istnieje dla kompatybilności z innymi
implementacjami.
.TP 
\fBMAP_ANONYMOUS\fP
.\" See the pgoff overflow check in do_mmap().
.\" See the offset check in sys_mmap in arch/x86/kernel/sys_x86_64.c.
Mapowanie nie jest oparte na pliku; jego zawartość jest inicjowana jako
zero. Argument \fIfd\fP jest ignorowany, jednak niektóre implementacje
wymagają, aby \fIfd\fP wynosiło \-1 jeśli podano \fBMAP_ANONYMOUS\fP (lub
\fBMAP_ANON\fP), dlatego przenośne aplikacje powinny używać tej
wartości. Argument \fIoffset\fP powinien wynosić zero. Obsługę \fBMAP_ANONYMOUS\fP
w połączeniu z \fBMAP_SHARED\fP dodano w Linuksie 2.4.
.TP 
\fBMAP_DENYWRITE\fP
.\" Introduced in 1.1.36, removed in 1.3.24.
Ten znacznik jest ignorowany (dawno temu \[em] Linux 2.0 i wcześniejsze
\[em] sygnalizował on, że próba zapisu to mapowanego pliku powinna zawieść z
\fBETXTBSY\fP; było to jednak źródłem ataków blokujących usługę (DoS)).
.TP 
\fBMAP_EXECUTABLE\fP
.\" Introduced in 1.1.38, removed in 1.3.24. Flag tested in proc_follow_link.
.\" (Long ago, it signaled that the underlying file is an executable.
.\" However, that information was not really used anywhere.)
.\" Linus talked about DOS related to MAP_EXECUTABLE, but he was thinking of
.\" MAP_DENYWRITE?
Ten znacznik jest ignorowany.
.TP 
\fBMAP_FILE\fP
.\" On some systems, this was required as the opposite of
.\" MAP_ANONYMOUS -- mtk, 1 May 2007
Znacznik służący zgodności. Ignorowany.
.TP 
\fBMAP_FIXED\fP
Nie interpretuje \fIaddr\fP jako wskazówki: umieszcza mapowanie dokładnie na
podanym adresie. \fIaddr\fP musi być właściwie wyrównany: w przypadku
większości architektur, wystarczająca jest wielokrotność rozmiaru strony;
jednak niektóre architektury mogą narzucać dodatkowe ograniczenia. Jeśli
obszar pamięci podany w \fIaddr\fP i \fIlength\fP nachodzi na strony jakiegoś
istniejącego mapowania, to te nachodzące części istniejącego mapowania
zostaną odrzucone. Jeśli podany adres nie może być użyty, wywołanie
\fBmmap\fP() zawiedzie.
.IP
Oprogramowanie, które ma zamiar być przenośne, powinno bardzo ostrożnie
korzystać ze znacznika \fBMAP_FIXED\fP, mając na względzie, że dokładny schemat
mapowań pamięci procesu może się znacznie zmieniać pomiędzy wersjami
Linuksa, wersjami biblioteki C i wydaniami systemu operacyjnego. \fIProszę dokładnie przeczytać omówienie tego znacznika w UWAGACH!\fP
.TP 
\fBMAP_FIXED_NOREPLACE\fP (od Linuksa 4.17)
.\" commit a4ff8e8620d3f4f50ac4b41e8067b7d395056843
Znacznik zapewnia zachowanie podobne do \fBMAP_FIXED\fP, jeśli chodzi o
wymuszenie adresu \fIaddr\fP, lecz z tą różnicą, że \fBMAP_FIXED_NOREPLACE\fP
nigdy nie narusza wcześniejszego zakresu mapowania. Jeśli żądany zakres
kolidowałby z istniejącym mapowaniem, to wywołanie zawiedzie z błędem
\fBEEXIST\fP. Znacznik ten może zatem posłużyć do niepodzielnej (z
uwzględnieniem innym wątków) próby mapowania zakresu adresowego: u jednego
wątku powiedzie się to, wszystkie inne zawiodą.
.IP
Proszę zauważyć, że starsze jądra, które nie rozpoznają znacznika
\fBMAP_FIXED_NOREPLACE\fP, zwykle (po wykryciu kolizji z wcześniejszym
mapowaniem) awaryjnie zachowają się jak \[Bq]nie\-\fBMAP_FIXED\fP\[rq]: zwrócą
adres, który jest odmienny od adresu żądanego. Oprogramowanie, które ma być
kompatybilne wstecznie, powinno zatem sprawdzać zwracany adres z adresem
żądanym.
.TP 
\fBMAP_GROWSDOWN\fP
Znacznik jest używany do stosów. Wskazuje systemowi pamięci wirtualnej
jądra, że mapowanie ma kontynuować się w dół pamięci. Zwracany adres jest o
jedną stronę niżej, niż obszar pamięci, który jest w rzeczywistości tworzony
w wirtualnej przestrzeni adresowej procesu. Dotknięcie adresu w
\[Bq]strzeżonej\[rq] stronie (guard page) poniżej mapowania spowoduje
zwiększenie mapowania o jedną stronę. Ten wzrost można powtarzać do momentu,
gdy mapowanie osiągnie wysoki koniec strony następnego niższego mapowania;
wówczas dotknięcie \[Bq]strzeżonej\[rq] strony spowoduje sygnał \fBSIGSEGV\fP.
.TP 
\fBMAP_HUGETLB\fP (od Linuksa 2.6.32)
Przydziela mapowanie za pomocą dużych (\[Bq]huge\[rq]) stron. Więcej
informacji w pliku \fIDocumentation/admin\-guide/mm/hugetlbpage.rst\fP w
źródłach jądra Linux oraz w UWAGACH poniżej.
.TP 
\fBMAP_HUGE_2MB\fP
.TQ
\fBMAP_HUGE_1GB\fP (od Linuksa 3.8)
.\" See https://lwn.net/Articles/533499/
Używane w połączeniu z \fBMAP_HUGETLB\fP, do wybrania alternatywnych rozmiarów
strony hugetlb (odpowiednio, 2\ MB i 1\ GB) w systemach, które obsługują
wiele rozmiarów stron hugetlb.
.IP
Ogólniej, żądany rozmiar dużych stron można skonfigurować, podając logarytm
o podstawie 2, żądanego rozmiaru strony, w sześciu bitach na przesunięciu
\fBMAP_HUGE_SHIFT\fP (wartość zero w tym polu bitowym oznacza domyślny rozmiar
dużej strony; można go sprawdzić za pomocą pola \fIHugepagesize\fP ujawnianego
w \fI/proc/meminfo\fP). Zatem, powyższe dwie stałe są zdefiniowane jako:
.IP
.in +4n
.EX
#define MAP_HUGE_2MB    (21 << MAP_HUGE_SHIFT)
#define MAP_HUGE_1GB    (30 << MAP_HUGE_SHIFT)
.EE
.in
.IP
Zakres obsługiwanych rozmiarów dużych stron w systemie można sprawdzić,
wypisując podkatalogi w katalogu \fI/sys/kernel/mm/hugepages\fP.
.TP 
\fBMAP_LOCKED\fP (od Linuksa 2.5.37)
.\" If set, the mapped pages will not be swapped out.
Oznacza mapowany obszar jako zablokowany w ten sam sposób, jak robi to
\fBmlock\fP(2). Ta implementacja postara się wypełnić (prefault) cały zakres,
lecz wywołanie \fBmmap\fP() nie zawodzi z błędem \fBENOMEM\fP gdy się to nie
powiedzie. Z tego względu później mogą wystąpić główne chybienia stron
(ang. major page fault). Semantyka ta nie jest zatem tak mocna jak
\fBmlock\fP(2). Jeśli po zainicjowaniu mapowania nie są później dopuszczalne
główne chybienia stron, należy korzystać w zamian z \fBmmap\fP() wraz z
\fBmlock\fP(2). Znacznik \fBMAP_LOCKED\fP jest ignorowany przez starsze jądra.
.TP 
\fBMAP_NONBLOCK\fP (od Linuksa 2.5.46)
.\" commit 54cb8821de07f2ffcd28c380ce9b93d5784b40d7
Znacznik ten ma znaczenie tylko w połączeniu z \fBMAP_POPULATE\fP. Nie
przeprowadza odczytu naprzód: wpisy tablicy stron są tworzone tylko w
przypadku stron, które są już obecne w RAM. Od Linuksa 2.6.23, znacznik ten
nie ma wpływu na \fBMAP_POPULATE\fP. W przyszłości, połączenie \fBMAP_POPULATE\fP
z \fBMAP_NONBLOCK\fP może zostać na nowo zaimplementowane.
.TP 
\fBMAP_NORESERVE\fP
Poleca nie rezerwować przestrzeni wymiany dla tego mapowania. Gdy przestrzeń
wymiany jest zarezerwowana, ma się gwarancję, że istnieje możliwość
modyfikacji mapowania. Gdy przestrzeń wymiany nie jest zarezerwowana, można
otrzymać \fBSIGSEGV\fP podczas zapisu, jeśli braknie pamięci fizycznej. Proszę
zapoznać się również z opisem pliku \fI/proc/sys/vm/overcommit_memory\fP w
\fBproc\fP(5). Przed Linuksem 2.6, znacznik ten działał tylko dla prywatnych,
zapisywalnych mapowań.
.TP 
\fBMAP_POPULATE\fP (od Linuksa 2.5.46)
Wypełnia (prefault) tablice strony dla mapowania. W przypadku mapowania
pliku, powoduje to odczyt z wyprzedzeniem pliku. W ten sposób redukuje się
blokowanie, przy późniejszych chybieniach stron (ang. page fault). Wywołanie
\fBmmap\fP() nie zawodzi, jeśli nie da się wypełnić mapowania (np. ze względu
na ograniczenie liczby mapowanych dużych (huge) stron, za pomocą
\fBMAP_HUGETLB\fP). Obsługę \fBMAP_POPULATE\fP w połączeniu z mapowaniami
prywatnymi dodano w Linuksie 2.6.23.
.TP 
\fBMAP_STACK\fP (od Linuksa 2.6.27)
Przydziela mapowanie na adresie odpowiednim dla stosu: procesu lub wątku.
.IP
.\" See http://lwn.net/Articles/294642 "Tangled up in threads", 19 Aug 08
.\" commit cd98a04a59e2f94fa64d5bf1e26498d27427d5e7
.\" http://thread.gmane.org/gmane.linux.kernel/720412
.\" "pthread_create() slow for many threads; also time to revisit 64b
.\"  context switch optimization?"
Znacznik ten jest w Linuksie instrukcją pustą. Jednak podając go, przenośne
aplikacje mogą zapewnić zyskanie obsługi znacznika, gdy zostanie on w
przyszłości zaimplementowany. Z tego względu jest używany w implementacji
wątkowania glibc, aby uwzględnić fakt, że niektóre architektury mogą (w
przyszłości) wymagać specjalnego traktowania przy alokowaniu stosu. Kolejnym
powodem korzystania z tego znacznika jest przenośność: \fBMAP_STACK\fP istnieje
(i działa) na niektórych innych systemach (np. niektórych BSD).
.TP 
\fBMAP_SYNC\fP (od Linuksa 4.15)
Znacznik ten jest dostępny jedynie z typem mapowania \fBMAP_SHARED_VALIDATE\fP;
mapowania typu \fBMAP_SHARED\fP po cichu go zignorują. Znacznik ten jest
obsługiwany jedynie dla plików obsługujących DAX (bezpośrednie mapowanie do
pamięci trwałej). W przypadku innych plików, utworzenie mapowania z tym
znacznikiem spowoduje wystąpienie błędu \fBEOPNOTSUPP\fP.
.IP
Dzielone mapowania pliku z tym znacznikiem zapewniają gwarancję, że choć
pewna część pamięci będzie zmapowana jako zapisywalna w przestrzeni
adresowej procesu, będzie ona widoczna w tym samym pliku, na tym samym
przesunięciu, nawet po załamaniu lub przeładowaniu systemu. W połączeniu z
odpowiednimi instrukcjami procesora, użytkownicy takich mapowań mają
zapewnioną lepszy tryb czynienia modyfikacji danych trwałymi.
.TP 
\fBMAP_UNINITIALIZED\fP (od Linuksa 2.6.33)
Nie czyści stron anonimowych. Znacznik ten ma polepszyć wydajność na
urządzeniach wbudowanych. Znacznik jest przestrzegany tylko, gdy jądro
skonfigurowano z opcją \fBCONFIG_MMAP_ALLOW_UNINITIALIZED\fP. Ze względu na
skutki w zakresie bezpieczeństwa, opcja ta jest zwykle włączana wyłącznie na
urządzeniach wbudowanych (tj. mających całkowitą kontrolę nad zawartością
pamięci użytkownika).
.P
.\" FIXME . for later review when Issue 8 is one day released...
.\" POSIX may add MAP_ANON in the future
.\" http://austingroupbugs.net/tag_view_page.php?tag_id=8
.\" http://austingroupbugs.net/view.php?id=850
Z powyższych znaczników, jedynie \fBMAP_FIXED\fP jest określony przez
POSIX.1\-2001 i POSIX.1\-2008. Większość systemów obsługuje jednak także
\fBMAP_ANONYMOUS\fP (lub jego synonim \fBMAP_ANON\fP).
.SS munmap()
Wywołanie systemowe \fBmunmap\fP() usuwa mapowanie z podanego zakresu adresów i
powoduje, że dalsze odwołania do adresów z tego zakresu będą generować
nieprawidłowe odwołania do pamięci. Mapowanie obszaru jest również
automatycznie usuwane, gdy proces się zakończy. Z drugiej strony, zamknięcie
deskryptora pliku nie usuwa mapowania obszaru.
.P
Adres \fIaddr\fP musi być wielokrotnością rozmiaru strony (ale \fIlength\fP już
nie musi). Usuwane jest mapowanie wszystkich stron zawierających fragmenty
ze wskazanego zakresu, wszystkie późniejsze odwołania do tych stron
wygenerują \fBSIGSEGV\fP. Nie jest błędem, gdy brak w podanym zakresie
zamapowanych stron.
.SH "WARTOŚĆ ZWRACANA"
Po pomyślnym zakończeniu \fBmmap\fP() zwraca wskaźnik do mapowanego obszaru. Po
błędzie zwracane jest \fBMAP_FAILED\fP (tj. \fI(void\ *)\ \-1\fP) i ustawiane
\fIerrno\fP, wskazując błąd.
.P
Po pomyślnym zakończeniu \fBmunmap\fP() zwraca 0. Po błędzie zwracane jest \-1 i
ustawiane \fIerrno\fP, wskazując błąd (prawdopodobnie 1\fBEINVAL\fP).
.SH BŁĘDY
.TP 
\fBEACCES\fP
Deskryptor pliku odnosi się do pliku innego niż zwykły plik. Lub zażądano
mapowania pliku, lecz \fIfd\fP nie jest otwarty do odczytu. Lub zażądano
\fBMAP_SHARED\fP i ustawiono \fBPROT_WRITE\fP, lecz \fIfd\fP nie jest otwarte w
trybie do odczytu i do zapisu (\fBO_RDWR\fP). Lub ustawiono \fBPROT_WRITE\fP, lecz
plik jest otwarty tylko do dopisywania.
.TP 
\fBEAGAIN\fP
Plik został zablokowany lub zablokowano zbyt wiele pamięci
(zob. \fBsetrlimit\fP(2)).
.TP 
\fBEBADF\fP
\fIfd\fP nie jest prawidłowym deskryptorem pliku (a nie ustawiono
\fBMAP_ANONYMOUS\fP).
.TP 
\fBEEXIST\fP
We \fIflags\fP podano \fBMAP_FIXED_NOREPLACE\fP, a zakres który opisuje \fIaddr\fP i
\fIlength\fP koliduje z istniejącym mapowaniem.
.TP 
\fBEINVAL\fP
Niewłaściwe \fIaddr\fP, \fIlength\fP lub \fIoffset\fP (np. mogą być zbyt duże lub
niewyrównane do granicy strony).
.TP 
\fBEINVAL\fP
(od Linuksa 2.6.12)  \fIlength\fP wynosiła 0.
.TP 
\fBEINVAL\fP
We \fIflags\fP nie wystąpiło żadne z: \fBMAP_PRIVATE\fP, \fBMAP_SHARED\fP lub
\fBMAP_SHARED_VALIDATE\fP.
.TP 
\fBENFILE\fP
.\" This is for shared anonymous segments
.\" [2.6.7] shmem_zero_setup()-->shmem_file_setup()-->get_empty_filp()
.\" .TP
.\" .B ENOEXEC
.\" A file could not be mapped for reading.
Zostało osiągnięte systemowe ograniczenie na całkowitą liczbę otwartych
plików.
.TP 
\fBENODEV\fP
System plików, na którym znajduje się podany plik, nie obsługuje mapowania w
pamięci.
.TP 
\fBENOMEM\fP
Brak dostępnej pamięci.
.TP 
\fBENOMEM\fP
Doszłoby do przekroczenia maksymalnej liczby mapowań procesu. Błąd ten może
wystąpić również dla \fBmunmap\fP(), przy usuwaniu mapowania z obszaru w środku
istniejącego mapowania, ponieważ spowodowałoby to powstanie dwóch mniejszych
mapowań po obu stronach niezmapowanego obszaru.
.TP 
\fBENOMEM\fP
(od Linuksa 4.7)  Doszłoby do przekroczenia limitu \fBRLIMIT_DATA\fP procesu,
opisanego w podręczniku \fBgetrlimit\fP(2).
.TP 
\fBENOMEM\fP
\fIaddr\fP przekroczyłoby wirtualną przestrzeń adresową procesora.
.TP 
\fBEOVERFLOW\fP
Na architekturze 32\-bitowej z rozszerzeniem dużych plików (tj. korzystając z
64\-bitowego \fIoff_t\fP): liczba stron użytych dla \fIlength\fP wraz z liczbą
stron użytych dla \fIoffset\fP przepełniłaby liczbę typu \fIunsigned long\fP
(32\-bitową).
.TP 
\fBEPERM\fP
.\" (Since Linux 2.4.25 / Linux 2.6.0.)
Argument \fIprot\fP pyta o \fBPROT_EXEC\fP lecz mapowany obszar należy do pliku
zamontowanego na systemie plików z opcją no\-exec (bez zezwolenia na
wykonywanie).
.TP 
\fBEPERM\fP
Operacja zablokowana, z powodu zapieczętowania pliku (ang. file seal);
zob. \fBfcntl\fP(2).
.TP 
\fBEPERM\fP
Podano znacznik \fBMAP_HUGETLB\fP, lecz wywołujący nie był uprzywilejowany (nie
miał przywileju \fBCAP_IPC_LOCK\fP (ang. capability)) i nie jest członkiem
grupy \fIsysctl_hugetlb_shm_group\fP; zob. opis
\fI/proc/sys/vm/sysctl_hugetlb_shm_group\fP w \fBproc_sys\fP(5).
.TP 
\fBETXTBSY\fP
Ustawiono \fBMAP_DENYWRITE\fP, lecz obiekt wskazywany przez \fIfd\fP jest otwarty
do zapisu.
.P
Użycie zamapowanego obszaru może spowodować wystąpienie następujących
sygnałów:
.TP 
\fBSIGSEGV\fP
Próba zapisu do obszaru zmapowanego tylko do odczytu.
.TP 
\fBSIGBUS\fP
Próba dostępu do strony bufora, która leży poza końcem mapowanego
pliku. Wyjaśnienie traktowania bajtów w stronie, która odnosi się do końca
mapowanego pliku i nie jest wielokrotnością rozmiaru strony zamieszczono w
UWAGACH.
.SH ATRYBUTY
Informacje o pojęciach używanych w tym rozdziale można znaleźć w podręczniku
\fBattributes\fP(7).
.TS
allbox;
lbx lb lb
l l l.
Interfejs	Atrybut	Wartość
T{
.na
.nh
\fBmmap\fP(),
\fBmunmap\fP()
T}	Bezpieczeństwo wątkowe	MT\-bezpieczne
.TE
.SH WERSJE
Na niektórych architekturach sprzętowych (np. i386), \fBPROT_WRITE\fP wymusza
\fBPROT_READ\fP. Od architektury zależy, czy \fBPROT_READ\fP wymusza \fBPROT_EXEC\fP,
czy nie. Programy przenośne powinny zawsze ustawiać \fBPROT_EXEC\fP, jeśli mają
zamiar wykonywać kod w nowym mapowaniu.
.P
Przenośnym sposobem tworzenia mapowań jest podanie \fIaddr\fP jako 0 (NULL) i
pominięcie \fBMAP_FIXED\fP z \fIflags\fP. W takim przypadku to system wybierze
adres mapowania; wybrany adres uniknie konfliktu z istniejącymi mapowaniami
i nie będzie wynosił 0. Jeśli podano znacznik \fBMAP_FIXED\fP , a \fIaddr\fP
wynosi 0 (NULL), to mapowany adres będzie wynosił 0 (NULL).
.P
Pewne stałe \fIflags\fP są zdefiniowane tylko wtedy, gdy zdefiniowano określone
makro sprawdzania cech (być może stało się to domyślnie): \fB_DEFAULT_SOURCE\fP
z glibc 2.19 lub późniejszymi; \fB_BSD_SOURCE\fP lub \fB_SVID_SOURCE\fP w glibc
2.19 i wcześniejszych (podanie \fB_GNU_SOURCE\fP jest również wystarczające i
wymaganie właśnie tego makra byłoby logiczniejsze, skoro wszystkie te
znaczniki są typowo linuksowe). Chodzi tu o znaczniki: \fBMAP_32BIT\fP,
\fBMAP_ANONYMOUS\fP (i synonim \fBMAP_ANON\fP), \fBMAP_DENYWRITE\fP,
\fBMAP_EXECUTABLE\fP, \fBMAP_FILE\fP, \fBMAP_GROWSDOWN\fP, \fBMAP_HUGETLB\fP,
\fBMAP_LOCKED\fP, \fBMAP_NONBLOCK\fP, \fBMAP_NORESERVE\fP, \fBMAP_POPULATE\fP oraz
\fBMAP_STACK\fP.
.SS "Różnice biblioteki C/jądra"
.\" Since around glibc 2.1/2.2, depending on the platform.
Niniejszy podręcznik opisuje interfejs zapewniany przez funkcję opakowującą
\fBmmap\fP() z glibc. Pierwotnie, funkcja ta przywoływała wywołanie systemowe o
tej samej nazwie. Od Linuksa 2.4, to wywołanie zostało zastąpione wywołaniem
\fBmmap2\fP(2), dlatego obecnie funkcja opakowująca \fBmmap\fP() z glibc
przywołuje \fBmmap2\fP(2) z odpowiednio dostosowanymi wartościami \fIoffset\fP.
.SH STANDARDY
POSIX.1\-2008.
.SH HISTORIA
.\" SVr4 documents additional error codes ENXIO and ENODEV.
.\" SUSv2 documents additional error codes EMFILE and EOVERFLOW.
POSIX.1\-2001, SVr4, 4.4BSD.
.P
.\" POSIX.1-2001: It shall be defined to -1 or 0 or 200112L.
.\" -1: unavailable, 0: ask using sysconf().
.\" glibc defines it to 1.
W systemach POSIX, na których dostępne są \fBmmap\fP(), \fBmsync\fP(2) i
\fBmunmap\fP(), \fB_POSIX_MAPPED_FILES\fP jest zdefiniowane w
\fI<unistd.h>\fP na wartość większą niż 0 (zob. też \fBsysconf\fP(3)).
.SH UWAGI
Pamięć mapowana za pomocą \fBmmap\fP() jest zachowywana poprzez \fBfork\fP(2) z
tymi samymi atrybutami.
.P
Plik jest mapowany w wielokrotnościach rozmiaru strony. Dla plików, które
nie są wielokrotnościami rozmiaru strony, pozostałe bajty w częściowej
stronie na końcu mapowania są zerowane podczas mapowania, a modyfikacje tego
obszaru nie są zapisywane w pliku. Efekt zmiany rozmiaru zamapowanego pliku
na zamapowane strony, które odpowiadają dodanym lub usuniętym obszarom
pliku, jest nieokreślony.
.P
.\"
Aplikacje mogą sprawdzić, które strony mapowania są aktualnie rezydentne w
buforze/buforze strony za pomocą \fBmincore\fP(2).
.SS "Bezpieczne korzystanie z MAP_FIXED"
Jedyne bezpieczne zastosowanie \fBMAP_FIXED\fP jest wtedy, gdy podany za pomocą
\fIaddr\fP i \fIlength\fP zakres adresów był uprzednio zarezerwowany przy użyciu
innego mapowania; w przeciwnym przypadku \fBMAP_FIXED\fP jest niebezpieczne,
ponieważ przymusowo usuwa wcześniejsze mapowania, przez co w przypadku
procesów wielowątkowych, łatwe staje się uszkodzenie swojej przestrzeni
adresowej.
.P
Przykładowo załóżmy, że wątek A przegląda \fI/proc/\fPpid\fI/maps\fP, aby odszukać
nieużywany zakres adresów, które można zmapować przy użyciu \fBMAP_FIXED\fP, a
wątek B w tym samym czasie uzyska część lub całość tego samego zakresu
adresów. Gdy wątek A następnie użyje \fBmmap(MAP_FIXED)\fP, efektywnie naruszy
mapowanie, które utworzył wątek B. W opisywanym scenariuszu, wątek B nie
musi bezpośrednio tworzyć mapowania; wystarczy utworzenie wywołania
bibliotecznego, które wewnętrznie korzysta z \fBdlopen\fP(3) do załadowania
jakiejś innej biblioteki współdzielonej. Wywołanie \fBdlopen\fP(3) zmapuje
bibliotekę do przestrzeni adresowej procesu. Co więcej, niemal każde
wywołanie biblioteczne może być zaimplementowane w sposób, który dodaje
mapowania pamięci do przestrzeni adresowej, albo za pomocą tej techniki,
albo jedynie alokując pamięć. Przykładem mogą być \fBbrk\fP(2), \fBmalloc\fP(3),
\fBpthread_create\fP(3) i biblioteki PAM
.UR http://www.linux\-pam.org
.UE .
.P
.\"
Od Linuksa 4.17, program wielowątkowy może skorzystać ze znacznika
\fBMAP_FIXED_NOREPLACE\fP, aby uniknąć niebezpieczeństwa opisanego wyżej, przy
tworzeniu mapowania pod konkretnym adresem, który nie został zarezerwowany
wcześniejszym mapowaniem.
.SS "Zmiany znaczników czasu w przypadku mapowań opartych na plikach"
Dla mapowań opartych na plikach pole \fIst_atime\fP zamapowanego pliku może
zostać zaktualizowane w dowolnym momencie pomiędzy \fBmmap\fP() i usunięciem
odpowiedniego mapowania; pierwsze odwołanie do zamapowanej strony spowoduje
zaktualizowanie tego pola, jeśli nie stało się to wcześniej.
.P
.\"
Pola \fIst_ctime\fP i \fIst_mtime\fP pliku zamapowanego z \fBPROT_WRITE\fP i
\fBMAP_SHARED\fP zostanie zaktualizowane po zapisie do mapowanego obszaru, a
przed późniejszym wywołaniem \fImsync\fP(2) ze znacznikiem \fBMS_SYNC\fP lub
\fBMS_ASYNC\fP, jeśli taki wywołanie wystąpi.
.SS "Mapowania dużych stron (Huge TLB)"
W przypadku mapowań korzystających z dużych (huge) stron, wymagania
dotyczące argumentów \fBmmap\fP() i \fBmunmap\fP() różnią się nieco, od wymagań
mapowań, korzystających z natywnego systemowego rozmiaru strony.
.P
W przypadku \fBmmap\fP(), \fIoffset\fP musi być wielokrotnością używanego rozmiaru
dużej strony. System automatycznie wyrówna \fIlength\fP do wielokrotności
używanego rozmiaru dużej strony.
.P
.\"
W przypadku \fBmunmap\fP(), \fIaddr\fP i \fIlength\fP muszą być wielokrotnościami
używanego systemowego rozmiaru dużej strony.
.SH USTERKI
W Linuksie, gwarancje zasugerowane powyżej w opisie \fBMAP_NORESERVE\fP nie
istnieją. Domyślnie, każdy proces może być zabity w dowolnym momencie, gdy
systemowi wyczerpie się pamięć.
.P
Przed Linuksem 2.6.7, znacznik \fBMAP_POPULATE\fP działał tylko, gdy \fIprot\fP
określono jako \fBPROT_NONE\fP.
.P
SUSv3 określa, że \fBmmap\fP() powinno zawieść, gdy \fIlength\fP wynosi 0. Jednak
przed Linuksem 2.6.12, \fBmmap\fP() było w takim przypadku pomyślne: nie
tworzono mapowania, a wywołanie zwracało \fIaddr\fP. Od Linuksa 2.6.12,
\fBmmap\fP() zawodzi w takim przypadku z błędem \fBEINVAL\fP.
.P
POSIX określa, ze system powinien zawsze wypełniać zerami wszelkie strony
częściowe na końcu obiektu, a system nigdy nie zapisze żadnych modyfikacji
obiektu poza jego końcem. W Linuksie, jeśli zapisze się dane do takiej
częściowej strony, poza końcem obiektu, dane pozostają w buforze strony
nawet po zamknięciu i odmapowaniu pliku, a choć dane nigdy nie są zapisywane
do samego pliku, kolejne mapowania mogą zobaczyć zmodyfikowaną zawartość. W
niektórych przypadkach, to zachowanie można poprawić wywołując \fBmsync\fP(2)
przed dokonaniem odmapowania; jednak nie działa to na \fBtmpfs\fP(5) (np. przy
użyciu interfejsu pamięci dzielonej POSIX opisanego w podręczniku
\fBshm_overview\fP(7)).
.SH PRZYKŁADY
.\" FIXME . Add an example here that uses an anonymous shared region for
.\" IPC between parent and child.
Poniższy program wypisuje część pliku, określonego w jego pierwszym
argumencie wiersza poleceń, na standardowe wyjście. Zakres wypisywanych
bajtów podaje się za pomocą wartości przesunięcia i długości, w drugim i
trzecim argumencie wiersza poleceń. Program tworzy mapowania pamięci
wymaganych stron pliku, a następnie używa \fBwrite\fP(2) do wypisania żądanych
bajtów.
.SS "Kod źródłowy programu"
.\" SRC BEGIN (mmap.c)
.EX
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
\&
#define handle_error(msg) \[rs]
    do { perror(msg); exit(EXIT_FAILURE); } while (0)
\&
int
main(int argc, char *argv[])
{
    int          fd;
    char         *addr;
    off_t        offset, pa_offset;
    size_t       length;
    ssize_t      s;
    struct stat  sb;
\&
    if (argc < 3 || argc > 4) {
        fprintf(stderr, "przesunięcie pliku %s [długość]\[rs]n", argv[0]);
        exit(EXIT_FAILURE);
    }
\&
    fd = open(argv[1], O_RDONLY);
    if (fd == \-1)
        handle_error("open");
\&
    if (fstat(fd, &sb) == \-1)           /* Do pobrania rozmiaru pliku */
        handle_error("fstat");
\&
    offset = atoi(argv[2]);
    pa_offset = offset & \[ti](sysconf(_SC_PAGE_SIZE) \- 1);
        /* przesunięcie dla mmap() musi być wyrównane do strony */
\&
    if (offset >= sb.st_size) {
        fprintf(stderr, "przesunięcie za końcem pliku\[rs]n");
        exit(EXIT_FAILURE);
    }
\&
    if (argc == 4) {
        length = atoi(argv[3]);
        if (offset + length > sb.st_size)
            length = sb.st_size \- offset;
                /* Nie można wypisać bajtów poza końcem pliku */
\&
    } else {    /* Brak arg. długości ==> wyświetl do końca pliku */
        length = sb.st_size \- offset;
    }
\&
    addr = mmap(NULL, length + offset \- pa_offset, PROT_READ,
                MAP_PRIVATE, fd, pa_offset);
    if (addr == MAP_FAILED)
        handle_error("mmap");
\&
    s = write(STDOUT_FILENO, addr + offset \- pa_offset, length);
    if (s != length) {
        if (s == \-1)
            handle_error("write");
\&
        fprintf(stderr, "częściowy zapis");
        exit(EXIT_FAILURE);
    }
\&
    munmap(addr, length + offset \- pa_offset);
    close(fd);
\&
    exit(EXIT_SUCCESS);
}
.EE
.\" SRC END
.SH "ZOBACZ TAKŻE"
\fBftruncate\fP(2), \fBgetpagesize\fP(2), \fBmemfd_create\fP(2), \fBmincore\fP(2),
\fBmlock\fP(2), \fBmmap2\fP(2), \fBmprotect\fP(2), \fBmremap\fP(2), \fBmsync\fP(2),
\fBremap_file_pages\fP(2), \fBsetrlimit\fP(2), \fBshmat\fP(2), \fBuserfaultfd\fP(2),
\fBshm_open\fP(3), \fBshm_overview\fP(7)
.P
Opis poniższych plików w \fBproc\fP(5): \fI/proc/\fPpid\fI/maps\fP,
\fI/proc/\fPpid\fI/map_files\fP i \fI/proc/\fPpid\fI/smaps\fP.
.P
B.O. Gallmeister, POSIX.4, O'Reilly, str. 128\[en]129 i 389\[en]391.
.\"
.\" Repeat after me: private read-only mappings are 100% equivalent to
.\" shared read-only mappings. No ifs, buts, or maybes. -- Linus
.PP
.SH TŁUMACZENIE
Tłumaczenie niniejszej strony podręcznika:
Przemek Borys <pborys@dione.ids.pl>,
Andrzej Krzysztofowicz <ankry@green.mf.pg.gda.pl>
i
Michał Kułach <michal.kulach@gmail.com>
.
.PP
Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach
licencji można uzyskać zapoznając się z
.UR https://www.gnu.org/licenses/gpl-3.0.html
GNU General Public License w wersji 3
.UE
lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.
.PP
Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy
dyskusyjnej
.MT manpages-pl-list@lists.sourceforge.net
.ME .
