.\" -*- coding: UTF-8 -*- '\" t .\" Copyright 1996, Andries E. Brouwer .\" Copyright 2006-2007, Michael Kerrisk .\" Copyright, the authors of the Linux man-pages project .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH mmap 2 "19 marca 2026 r." "Linux man\-pages 6.18" .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 \fP .P \fBvoid *mmap(\fPsize_t length; \fB 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(\fPsize_t length; \fB 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 WERSJE. .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. 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_sys_fs\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 \fIhugetlb_shm_group\fP; zob. opis \fI/proc/sys/vm/hugetlb_shm_group\fP w \fBproc_sys_vm\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\-2024. .SH HISTORIA .\" SVr4 documents additional error codes ENXIO and ENODEV. .\" SUSv2 documents additional error codes EMFILE and EOVERFLOW. SVr4, 4.4BSD, SUSv1, POSIX.1\-1996. .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\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 ZASTRZEŻENIA .\" W przeciwieństwie do typowych implementacji \fBmalloc\fP(3), \fBmmap\fP() nie zapobiega tworzeniu obiektów większych od \fBPTRDIFF_MAX\fP. Obiekty większe od \fBPTRDIFF_MAX\fP działają w C jedynie w ograniczony sposób (w szczególności, odejmowanie wskaźników daje niezdefiniowane zachowanie, jeśli wynik byłby większy niż \fBPTRDIFF_MAX\fP). Dodatkowo, GCC zakłada, że żaden obiekt nie jest większy od \fBPTRDIFF_MAX\fP. \fBPTRDIFF_MAX\fP zwykle wynosi połowę rozmiaru przestrzeni adresowej, zatem w przypadku procesów 32\-bitowych jest to zwykle \fB0x7fffffff\fP (niemal 2 GiB). .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 #include #include #include #include #include #include #include \& 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) err(EXIT_FAILURE, "open"); \& if (fstat(fd, &sb) == \-1) /* Do pobrania rozmiaru pliku */ err(EXIT_FAILURE, "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) err(EXIT_FAILURE, "mmap"); \& s = write(STDOUT_FILENO, addr + offset \- pa_offset, length); if (s != length) { if (s == \-1) err(EXIT_FAILURE, "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 , Andrzej Krzysztofowicz i Michał Kułach . .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 .