mmap

MMAP(2)         Ð ÑководÑÑво пÑогÑаммиÑÑа Linux         MMAP(2)



ÐÐЯ
       mmap, munmap - оÑобÑÐ°Ð¶Ð°ÐµÑ ÑÐ°Ð¹Ð»Ñ Ð¸Ð»Ð¸ ÑÑÑÑойÑÑва в
       памÑÑи, или ÑдалÑÐµÑ Ð¸Ñ Ð¾ÑобÑажение

ÐÐÐÐÐ
       #include <sys/mman.h>

       void *mmap(void *addr, size_t length, int prot, int flags,
                  int fd, off_t offset);
       int munmap(void *addr, size_t length);

       ÐнÑоÑмаÑÐ¸Ñ Ð¿Ð¾ ÑÑебованиÑм макÑоÑа
       ÑеÑÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑвойÑÑв ÑмоÑÑиÑе в Ñазделе
       ÐÐÐÐЧÐÐÐЯ.

ÐÐÐСÐÐÐÐ
       ÐÑзов mmap() ÑоздаÑÑ Ð½Ð¾Ð²Ð¾Ðµ оÑобÑажение в
       виÑÑÑалÑном адÑеÑном пÑоÑÑÑанÑÑве вÑзÑваÑÑего
       пÑоÑеÑÑа. ÐдÑÐµÑ Ð½Ð°Ñала нового оÑобÑажениÑ
       ÑказÑваеÑÑÑ Ð² addr. РаÑгÑменÑе length задаÑÑÑÑ
       длина оÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ (должна бÑÑÑ Ð±Ð¾Ð»ÑÑе 0).

       ÐÑли знаÑение addr Ñавно NULL, Ñо ÑдÑо Ñамо
       вÑбиÑÐ°ÐµÑ Ð°Ð´ÑÐµÑ (вÑÑовненнÑй по ÑÑÑаниÑе), по
       коÑоÑÐ¾Ð¼Ñ ÑоздаÑÑÑÑ Ð¾ÑобÑажение; ÑÑо наиболее
       пеÑеноÑимÑй меÑод ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾
       оÑобÑажениÑ. ÐÑли знаÑение addr не Ñавно NULL,
       Ñо ÑдÑо ÑÑиÑÑÐ²Ð°ÐµÑ ÑÑо пÑи ÑазмеÑении
       оÑобÑажениÑ; в Linux оÑобÑажение бÑдеÑ
       Ñоздано в ÑÑÑаниÑе ближайÑей к гÑаниÑе.
       ÐдÑÐµÑ Ð½Ð¾Ð²Ð¾Ð³Ð¾ оÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð²Ð¾Ð·Ð²ÑаÑаеÑÑÑ ÐºÐ°Ðº
       ÑезÑлÑÑÐ°Ñ Ð²Ñзова.

       СодеÑжимое Ñайлового оÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ (в
       оÑлиÑие Ð¾Ñ Ð°Ð½Ð¾Ð½Ð¸Ð¼Ð½Ð¾Ð³Ð¾ оÑобÑажениÑ; ÑмоÑÑиÑе
       MAP_ANONYMOUS далее) иниÑиализиÑÑеÑÑÑ Ð´Ð°Ð½Ð½Ñми из
       Ñайла (или обÑекÑа), на коÑоÑÑй ÑказÑваеÑ
       ÑайловÑй деÑкÑипÑÐ¾Ñ fd, длиной length байÑ,
       наÑÐ¸Ð½Ð°Ñ Ñо ÑмеÑÐµÐ½Ð¸Ñ offset. ÐнаÑение offset
       должно бÑÑÑ ÐºÑаÑно ÑазмеÑÑ (возвÑаÑаеÑÑÑ
       sysconf(_SC_PAGE_SIZE)) ÑÑÑаниÑÑ.

       РаÑгÑменÑе prot ÑказÑваеÑÑÑ Ð¶ÐµÐ»Ð°ÐµÐ¼Ð°Ñ Ð·Ð°ÑиÑа
       памÑÑи оÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ (не должна
       конÑликÑоваÑÑ Ñ Ñежимом оÑкÑÑÑого Ñайла).
       ÐнаÑением Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ PROT_NONE или побиÑово
       ÑложеннÑе (OR) ÑледÑÑÑие Ñлаги:

       PROT_EXEC  СÑÑаниÑÑ Ð´Ð¾ÑÑÑÐ¿Ð½Ñ Ð´Ð»Ñ Ð¸ÑполнениÑ.

       PROT_READ  СÑÑаниÑÑ Ð´Ð¾ÑÑÑÐ¿Ð½Ñ Ð´Ð»Ñ ÑÑениÑ.

       PROT_WRITE СÑÑаниÑÑ Ð´Ð¾ÑÑÑÐ¿Ð½Ñ Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи.

       PROT_NONE  СÑÑаниÑÑ Ð½ÐµÐ´Ð¾ÑÑÑпнÑ.

       РаÑгÑменÑе flags задаÑÑÑÑ Ð±ÑдÑÑ Ð»Ð¸ изменениÑ
       оÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð²Ð¸Ð´Ð¸Ð¼Ñ Ð´ÑÑгим пÑоÑеÑÑам,
       оÑобÑажаÑÑим ÑÑ Ð¶Ðµ облаÑÑÑ, и бÑдÑÑ Ð»Ð¸
       Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿ÐµÑенеÑÐµÐ½Ñ Ð² оÑобÑажÑннÑй Ñайл.
       Ðанное поведение опÑеделÑеÑÑÑ Ð² flags одним
       из ÑледÑÑÑÐ¸Ñ Ð·Ð½Ð°Ñений:

       MAP_SHARED
              СделаÑÑ Ð¾ÑобÑажение обÑим. ÐзменениÑ
              оÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð²Ð¸Ð´Ð¸Ð¼Ñ Ð²Ñем пÑоÑеÑÑам,
              оÑобÑажаÑÑим ÑÑ Ð¶Ðµ облаÑÑÑ Ð¸ (еÑли
              оÑобÑажение вÑполнÑеÑÑÑ Ð¸Ð· Ñайла)
              Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð·Ð°Ð½Ð¾ÑÑÑÑÑ Ð² оÑобÑажÑннÑй Ñайл
              (Ð´Ð»Ñ Ð±Ð¾Ð»ÐµÐµ ÑоÑного конÑÑÐ¾Ð»Ñ Ð½Ð°Ð´
              изменениÑми Ñайла нÑжно иÑполÑзоваÑÑ
              msync(2)).

       MAP_PRIVATE
              СоздаÑÑ Ð·Ð°ÐºÑÑÑое оÑобÑажение Ñ
              меÑанизмом копиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ñи запиÑи.
              ÐÐ·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¾ÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð½ÐµÐ²Ð¸Ð´Ð¸Ð¼Ñ Ð´ÑÑгим
              пÑоÑеÑÑам, оÑобÑажаÑÑим ÑÐ¾Ñ Ð¶Ðµ Ñайл, и Ñам
              Ñайл не изменÑеÑÑÑ. Ðе опÑеделено, бÑдÑÑ
              ли Ð²Ð¸Ð´Ð¸Ð¼Ñ Ð² оÑобÑажÑнной облаÑÑи
              Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² Ñайле, ÑделаннÑе поÑле
              вÑзова mmap().

       ÐÑи Ñлаги опиÑÐ°Ð½Ñ Ð² POSIX.1-2001 и POSIX.1-2008.

       ÐÑоме ÑÑого в flags могÑÑ Ð±ÑÑÑ ÑказанÑ
       (побиÑовÑм Ñложением):

       MAP_32BIT (наÑÐ¸Ð½Ð°Ñ Ñ Linux 2.4.20, 2.6)
              ÐомеÑÑиÑÑ Ð¾ÑобÑажение в пеÑвÑе 2
              гигабайÑа адÑеÑного пÑоÑÑÑанÑÑва
              пÑоÑеÑÑа. ÐÑÐ¾Ñ Ñлаг поддеÑживаеÑÑÑ ÑолÑко
              на аÑÑиÑекÑÑÑе x86-64 Ð´Ð»Ñ 64-биÑнÑÑ Ð¿ÑогÑамм.
              Ðн бÑл добавлен Ð´Ð»Ñ ÑазмеÑÐµÐ½Ð¸Ñ ÑÑеков
              ниÑей в пеÑвÑÑ 2 ÐРпамÑÑи, ÑÑо даÑÑ
              ÑвелиÑение пÑоизводиÑелÑноÑÑи пÑи
              пеÑеклÑÑÐµÐ½Ð¸Ñ ÐºÐ¾Ð½ÑекÑÑа на некоÑоÑÑÑ
              пеÑвÑÑ 64-биÑнÑÑ Ð¿ÑоÑеÑÑоÑаÑ. Ð ÑовÑеменнÑÑ
              пÑоÑеÑÑоÑÐ°Ñ x86-64 Ñакой пÑÐ¾Ð±Ð»ÐµÐ¼Ñ Ñ
              пÑоизводиÑелÑноÑÑÑÑ Ð±Ð¾Ð»ÑÑе неÑ, поÑÑомÑ
              на ÑÐ°ÐºÐ¸Ñ ÑиÑÑÐµÐ¼Ð°Ñ Ð´Ð°Ð½Ð½Ñй Ñлаг болÑÑе не
              ÑÑебÑеÑÑÑ. Ðн игноÑиÑÑеÑÑÑ, еÑли Ñказан
              Ñлаг MAP_FIXED.

       MAP_ANON
              Синоним MAP_ANONYMOUS. УÑÑаÑел.

       MAP_ANONYMOUS
              ÐÑобÑажение не пÑивÑзанное к ÑайлÑ;
              его ÑодеÑжимое иниÑиализиÑÑеÑÑÑ Ð½ÑлÑми.
              ÐÑгÑÐ¼ÐµÐ½Ñ fd игноÑиÑÑеÑÑÑ ; однако в
              некоÑоÑÑÑ ÑеализаÑиÑÑ Ð¿Ñи Ñказании
              MAP_ANONYMOUS (или MAP_ANON) ÑÑебÑеÑÑÑ ÑказÑваÑÑ fd
              Ñавное -1, и Ñак нÑжно поÑÑÑпаÑÑ Ð´Ð»Ñ
              пеÑеноÑимоÑÑи пÑиложений.  ÐÑгÑÐ¼ÐµÐ½Ñ offset
              должен бÑÑÑ Ð½Ð¾Ð»Ñ.  ÐÑполÑзование
              MAP_ANONYMOUS вмеÑÑе Ñ MAP_SHARED поддеÑживаеÑÑÑ
              в Linux ÑолÑко наÑÐ¸Ð½Ð°Ñ Ñ ÑдÑа веÑÑии 2.4.

       MAP_DENYWRITE
              ÐÑÐ¾Ñ Ñлаг игноÑиÑÑеÑÑÑ. РанÑÑе он
              обознаÑал, ÑÑо попÑÑки запиÑи в
              подÑинÑннÑе ÑÐ°Ð¹Ð»Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð·Ð°Ð²ÐµÑÑаÑÑÑÑ Ñ
              кодом оÑибки ETXTBUSY. Ðо ÑÑо ÑÑало оÑновой
              Ð´Ð»Ñ Ð°Ñак Ñипа оÑказа в обÑлÑживании.

       MAP_EXECUTABLE
              ÐÑÐ¾Ñ Ñлаг игноÑиÑÑеÑÑÑ.

       MAP_FILE
              Флаг Ð´Ð»Ñ ÑовмеÑÑимоÑÑи, игноÑиÑÑеÑÑÑ.

       MAP_FIXED
              Ðе ÑÑиÑÑваÑÑ addr как подÑказкÑ: помеÑаÑÑ
              оÑобÑажение ÑоÑно по ÑÑÐ¾Ð¼Ñ Ð°Ð´ÑеÑÑ.
              ÐнаÑение addr должно бÑÑÑ Ð²ÑÑовнено
              ÑооÑвеÑÑÑвÑÑÑим обÑазом: на болÑÑинÑÑве
              аÑÑиÑекÑÑÑ Ð¾Ð½ должно бÑÑÑ ÐºÑаÑно ÑазмеÑÑ
              ÑÑÑаниÑÑ; однако некоÑоÑÑе аÑÑиÑекÑÑÑÑ
              могÑÑ Ð½Ð°ÐºÐ»Ð°Ð´ÑваÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе
              огÑаниÑениÑ. ÐÑли облаÑÑÑ Ð¿Ð°Ð¼ÑÑи,
              Ð·Ð°Ð´Ð°Ð²Ð°ÐµÐ¼Ð°Ñ addr и len, пеÑекÑÑваеÑÑÑ Ñо
              ÑÑÑаниÑами ÑÑÑеÑÑвÑÑÑÐ¸Ñ Ð¾ÑобÑажений, Ñо
              пеÑекÑÑваÑÑаÑÑÑ ÑаÑÑÑ ÑÑÑеÑÑвÑÑÑиÑ
              оÑобÑажений бÑÐ´ÐµÑ Ð¾ÑбÑоÑена. ÐÑли
              заданнÑй адÑÐµÑ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ
              иÑполÑзован, Ñо вÑзов mmap() завеÑÑаеÑÑÑ
              оÑибкой. РпеÑеноÑимом ÐÐ ÑÑÐ¾Ñ Ñлаг нÑжно
              иÑполÑзоваÑÑ Ð¾ÑÑоÑожно, Ñак как ÑоÑнаÑ
              ÑаÑкладка пÑоÑеÑÑа в памÑÑи, доÑÑÑпнаÑ
              Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ, Ð¼Ð¾Ð¶ÐµÑ Ð·Ð½Ð°ÑиÑелÑно
              оÑлиÑаÑÑÑÑ Ð² ÑазнÑÑ Ð²ÐµÑÑиÑÑ ÑдеÑ,
              библиоÑеки С и вÑпÑÑÐºÐ°Ñ Ð¾Ð¿ÐµÑаÑионной
              ÑиÑÑемÑ.

              ÐÑоме Ñого, даннÑй Ñлаг ÑÑезвÑÑайно
              опаÑен (когда иÑполÑзÑеÑÑÑ
              ÑамоÑÑоÑÑелÑно), поÑÐ¾Ð¼Ñ ÑÑо пÑоиÑÑодиÑ
              пÑинÑдиÑелÑное Ñдаление ÑÑÑеÑÑвÑÑÑиÑ
              Ñанее оÑобÑажений, ÑпÑоÑаÑÑее
              повÑеждение ÑобÑÑвенное адÑеÑное
              пÑоÑÑÑанÑÑво многониÑевÑÑ Ð¿ÑоÑеÑÑов.

              ÐапÑимеÑ, ниÑÑ Ð Ð¿ÑоÑмаÑÑÐ¸Ð²Ð°ÐµÑ /proc/<pid>/maps
              и наÑÐ¾Ð´Ð¸Ñ Ð´Ð¾ÑÑÑпнÑй адÑеÑнÑй диапазон,
              а в Ñоже вÑÐµÐ¼Ñ Ð½Ð¸ÑÑ Ð Ð·Ð°ÑваÑÑÐ²Ð°ÐµÑ ÑаÑÑÑ Ð¸Ð»Ð¸
              вÑÑ Ñоже адÑеÑное пÑоÑÑÑанÑÑво. ÐиÑÑ Ð
              вÑзÑÐ²Ð°ÐµÑ mmap(MAP_FIXED), ÑÑо пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ð²
              пеÑезапиÑи оÑобÑажениÑ, Ñозданного
              ниÑÑÑ Ð.

              ÐиÑÑ Ð Ð¼Ð¾Ð¶ÐµÑ Ð½Ðµ ÑоздаваÑÑ Ð¾ÑобÑажение
              напÑÑмÑÑ â доÑÑаÑоÑно пÑоÑÑого вÑзова
              библиоÑеÑной ÑÑнкÑии, Ð´Ð»Ñ ÐºÐ¾ÑоÑого
              внÑÑÑи задейÑÑвÑеÑÑÑ dlopen(3) Ð´Ð»Ñ Ð·Ð°Ð³ÑÑзки
              какой-Ñо дÑÑгой обÑей библиоÑеки.
              ÐÑзов dlopen(3) оÑобÑÐ°Ð·Ð¸Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾ÑÐµÐºÑ Ð²
              адÑеÑное пÑоÑÑÑанÑÑво пÑоÑеÑÑа. ÐÑоме
              ÑÑого, поÑÑи лÑбой библиоÑеÑнÑй вÑзов
              Ð¼Ð¾Ð¶ÐµÑ Ð±Ñ Ñеализован ÑпоÑобом, коÑоÑÑй
              добавлÑÐµÑ Ð¾ÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð°Ð¼ÑÑи в
              адÑеÑное пÑоÑÑÑанÑÑво ÑÑим же ÑпоÑобом
              или пÑоÑÑо вÑделÑÑ Ð¿Ð°Ð¼ÑÑÑ. РкаÑеÑÑве
              пÑимеÑа можно ÑпомÑнÑÑÑ brk(2), malloc(3),
              pthread_create(3) и библиоÑеки PAM
              ⟨http://www.linux-pam.org⟩.

       MAP_GROWSDOWN
              ÐÑÐ¾Ñ Ñлаг иÑполÑзÑеÑÑÑ Ð´Ð»Ñ ÑÑеков. ÐлÑ
              виÑÑÑалÑной ÑиÑÑÐµÐ¼Ñ Ð¿Ð°Ð¼ÑÑи ÑдÑа он
              обознаÑаеÑ, ÑÑо оÑобÑажение должно
              ÑаÑÑиÑÑÑÑÑÑ Ð²Ð½Ð¸Ð· по памÑÑи. ÐозвÑаÑаемÑй
              адÑÐµÑ ÑказÑÐ²Ð°ÐµÑ Ð½Ð° Ð¾Ð´Ð½Ñ ÑÑÑаниÑÑ Ð½Ð¸Ð¶Ðµ
              облаÑÑи памÑÑи, коÑоÑÐ°Ñ Ð²
              дейÑÑвиÑелÑноÑÑи ÑоздаÑÑÑÑ Ð² виÑÑÑалÑном
              адÑеÑном пÑоÑÑÑанÑÑве пÑоÑеÑÑа. ÐбÑаÑение
              к адÑеÑÑ Ð½Ð¸Ð¶Ðµ «заÑиÑной» ÑÑÑаниÑÑ
              оÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¿ÑиведÑÑ Ðº ÑаÑÑиÑениÑ
              оÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð½Ð° ÑÑÑаниÑÑ. УвелиÑение
              Ñаким ÑпоÑобом можно повÑоÑÑÑÑ Ð´Ð¾ ÑеÑ
              поÑ, пока ÑоÑÑ Ð¾ÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑÑÑаниÑÑ
              веÑÑним конÑом не доÑÑÐ¸Ð³Ð½ÐµÑ ÑледÑÑÑего
              нижнего оÑобÑажениÑ, пÑи Ñаком
              обÑаÑении к «заÑиÑной» ÑÑÑаниÑÑ
              Ð²Ð¾Ð·Ð½Ð¸ÐºÐ½ÐµÑ Ñигнал SIGSEGV.

       MAP_HUGETLB (наÑÐ¸Ð½Ð°Ñ Ñ Linux 2.6.32)
              ÐÑделÑÑÑ Ð¾ÑобÑажение иÑполÑзÑÑ Â«Ð¾Ð³ÑомнÑе
              ÑÑÑаниÑÑ». ÐополниÑелÑнÑÑ Ð¸Ð½ÑоÑмаÑиÑ
              ÑмоÑÑиÑе в Ñайле иÑÑодного кода ÑдÑа Linux
              Documentation/vm/hugetlbpage.txt, а Ñакже ÑледÑÑÑее
              дополнение.

       MAP_HUGE_2MB, MAP_HUGE_1GB (наÑÐ¸Ð½Ð°Ñ Ñ Linux 3.8)
              ÐÑполÑзÑеÑÑÑ ÐºÐ°Ðº дополнение к MAP_HUGETLB
              Ð´Ð»Ñ Ð²ÑбоÑа ÑазмеÑа ÑÑÑаниÑÑ hugetlb (2 ÐРи 1 ÐÐ,
              ÑооÑвеÑÑÑвенно), ÑÑабоÑÐ°ÐµÑ ÑолÑко в
              ÑиÑÑеме коÑоÑÐ°Ñ Ð¿Ð¾Ð´Ð´ÐµÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑазлиÑнÑе
              ÑазмеÑÑ Ð±Ð¾Ð»ÑÑÐ¸Ñ ÑÑÑаниÑ.

              ÐообÑе, желаемÑй ÑÐ°Ð·Ð¼ÐµÑ Ð¾Ð³Ñомной
              ÑÑÑаниÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ наÑÑÑоиÑÑ Ð·Ð°ÐºÐ¾Ð´Ð¸Ñовав
              логаÑиÑм 2 Ð¾Ñ Ð¶ÐµÐ»Ð°ÐµÐ¼Ð¾Ð³Ð¾ ÑазмеÑа ÑÑÑаниÑÑ
              в ÑеÑÑи биÑÐ°Ñ Ñо ÑмеÑением MAP_HUGE_SHIFT
              (знаÑение нÑÐ»Ñ Ð² ÑÑом биÑовом поле
              ознаÑÐ°ÐµÑ Ð²ÑÐ±Ð¾Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¾Ð³Ñомной
              ÑÑÑаниÑÑ Ð¿Ð¾ ÑмолÑаниÑ; ÑÑо знаÑение
              можно найÑи в поле Hugepagesize пÑоÑмоÑÑев
              Ñайл /proc/meminfo). Таким обÑазом две
              показаннÑе вÑÑе конÑÑанÑÑ Ð¾Ð¿ÑеделенÑ
              как:

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

              РабоÑий диапазон ÑÑÑÐ°Ð½Ð¸Ñ Ð¾Ð³Ñомного
              ÑазмеÑа Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¾Ð±Ð½Ð°ÑÑжен, пеÑеÑиÑлив
              подкаÑалоги в /sys/kernel/mm/hugepages.

       MAP_LOCKED (наÑÐ¸Ð½Ð°Ñ Ñ Linux 2.5.37)
              ÐомеÑиÑÑ Ð¾ÑобÑажаемÑÑ Ð¾Ð±Ð»Ð°ÑÑÑ ÐºÐ°Ðº
              заблокиÑованнÑÑ Ñаким же обÑазом как
              Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ mlock(2). ÐÐ°Ð½Ð½Ð°Ñ ÑеализаÑÐ¸Ñ Ð±ÑдеÑ
              пÑÑаÑÑÑÑ Ð·Ð°Ð¿Ð¾Ð»Ð½Ð¸ÑÑ (пÑедоÑказ) облаÑÑÑ
              полноÑÑÑÑ, но вÑзов mmap() не завеÑÑиÑÑÑ
              оÑибкой ENOMEM, еÑли ÑÑо не ÑдаÑÑÑÑ ÑделаÑÑ.
              ÐоÑÑÐ¾Ð¼Ñ Ð´ÐµÐ¹ÑÑвиÑелÑнÑе оÑÐºÐ°Ð·Ñ Ð¼Ð¾Ð³ÑÑ
              пÑоизойÑи позднее. Такой алгоÑиÑм не
              ÑÐ¾Ð²Ð¿Ð°Ð´Ð°ÐµÑ Ñ mlock(2). ÐÑжно иÑполÑзоваÑÑ
              mmap() плÑÑ mlock(2), еÑли дейÑÑвиÑелÑнÑе
              оÑÐºÐ°Ð·Ñ Ð½ÐµÐ´Ð¾Ð¿ÑÑÑÐ¸Ð¼Ñ Ð¿Ð¾Ñле иниÑиализаÑии
              оÑобÑажениÑ. Ð ÑÑаÑÑÑ ÑдÑÐ°Ñ Ñлаг MAP_LOCKED
              игноÑиÑÑеÑÑÑ.

       MAP_NONBLOCK (наÑÐ¸Ð½Ð°Ñ Ñ Linux 2.5.46)
              ÐаннÑй Ñлаг Ð¸Ð¼ÐµÐµÑ ÑмÑÑл ÑолÑко вмеÑÑе Ñ
              MAP_POPULATE. Ðе вÑполнÑÑÑ ÑпÑеждаÑÑее ÑÑение:
              ÑолÑко ÑоздаÑÑ Ð·Ð°Ð¿Ð¸Ñи в ÑаблиÑе ÑÑÑаниÑ
              Ð´Ð»Ñ ÑÑÑаниÑ, коÑоÑÑе Ñже еÑÑÑ ÐÐУ. ÐаÑÐ¸Ð½Ð°Ñ Ñ
              Linux 2.6.23 ÑÑÐ¾Ñ Ñлаг пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº ÑомÑ, ÑÑо
              вÑполнение ÑабоÑÑ MAP_POPULATE оÑменÑеÑÑÑ.
              Ðогда-нибÑÐ´Ñ ÐºÐ¾Ð¼Ð±Ð¸Ð½Ð°ÑÐ¸Ñ MAP_POPULATE и
              MAP_NONBLOCK Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ñеализована заново.

       MAP_NORESERVE
              Ðе ÑезеÑвиÑоваÑÑ ÑÑÑаниÑÑ Ð¿ÑоÑÑÑанÑÑва
              подкаÑки Ð´Ð»Ñ ÑÑого оÑобÑажениÑ. ÐÑли
              пÑоÑÑÑанÑÑво подкаÑки ÑезеÑвиÑÑеÑÑÑ, Ñо
              Ð´Ð»Ñ Ð¾ÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð³Ð°ÑанÑиÑÑеÑÑÑ
              возможноÑÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ. ÐÑли оно не
              ÑезеÑвиÑÑеÑÑÑ, Ñо можно полÑÑиÑÑ Ñигнал
              SIGSEGV пÑи запиÑи, еÑли ÑизиÑеÑÐºÐ°Ñ Ð¿Ð°Ð¼ÑÑÑ
              бÑÐ´ÐµÑ Ð½ÐµÐ´Ð¾ÑÑÑпна. СмоÑÑиÑе Ñакже
              опиÑание Ñайла /proc/sys/vm/overcommit_memory в
              proc(5). Ð ÑдÑÐ°Ñ Ð´Ð¾ 2.6 ÑÑÐ¾Ñ Ñлаг дейÑÑвовал
              ÑолÑко Ð´Ð»Ñ ÑаÑÑнÑÑ Ð´Ð¾ÑÑÑпнÑÑ Ð½Ð° запиÑÑ
              оÑобÑажений.

       MAP_POPULATE (наÑÐ¸Ð½Ð°Ñ Ñ Linux 2.5.46)
              ÐаполниÑÑ (до возникновениÑ
              ÑÑÑаниÑного пÑеÑÑваниÑ, prefault) ÑÑÑаниÑнÑе
              ÑаблиÑÑ Ð¾ÑобÑажениÑ. ÐÐ»Ñ Ñайлового
              оÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑÑо пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº опеÑежаÑÑемÑ
              ÑÑÐµÐ½Ð¸Ñ Ð¸Ð· Ñайла. РдалÑнейÑем ÑÑо
              Ð¿Ð¾Ð¼Ð¾Ð³Ð°ÐµÑ ÑокÑаÑиÑÑ Ð±Ð»Ð¾ÐºÐ¸ÑÐ¾Ð²ÐºÑ Ð¿Ð¾ оÑказÑ
              ÑÑÑаниÑ. Флаг MAP_POPULATE поддеÑживаеÑÑÑ Ð´Ð»Ñ
              закÑÑÑÑÑ Ð¾ÑобÑажений ÑолÑко наÑÐ¸Ð½Ð°Ñ Ñ Linux
              2.6.23.

       MAP_STACK (наÑÐ¸Ð½Ð°Ñ Ñ Linux 2.6.27)
              РазмеÑÑиÑÑ Ð¾ÑобÑажение по адÑеÑÑ,
              пÑÐ¸Ð³Ð¾Ð´Ð½Ð¾Ð¼Ñ Ð´Ð»Ñ Ð¿ÑоÑеÑÑа или Ð´Ð»Ñ ÑÑека
              ниÑи. РнаÑÑоÑÑее вÑÐµÐ¼Ñ Ð´Ð»Ñ ÑÑого Ñлага не
              вÑполнÑÑÑÑÑ ÐºÐ°ÐºÐ¸Ðµ-либо дейÑÑвиÑ, но он
              иÑполÑзÑеÑÑÑ Ð´Ð»Ñ ÑеализаÑии ниÑей в glibc;
              еÑли на какой-Ñо аÑÑиÑекÑÑÑе поÑÑебÑÑÑÑÑ
              ÑпеÑиалÑнÑе дейÑÑÐ²Ð¸Ñ Ð¿Ð¾ вÑÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÑÑека,
              Ñо позже Ð¸Ñ Ð¿Ð¾Ð´Ð´ÐµÑжка Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ
              пÑозÑаÑно добавлена в glibc.

       MAP_UNINITIALIZED (наÑÐ¸Ð½Ð°Ñ Ñ Linux 2.6.33)
              Ðе оÑиÑаÑÑ Ð°Ð½Ð¾Ð½Ð¸Ð¼Ð½Ñе ÑÑÑаниÑÑ. ÐÑÐ¾Ñ Ñлаг
              пÑедназнаÑен Ð´Ð»Ñ Ð¿Ð¾Ð²ÑÑениÑ
              пÑоизводиÑелÑноÑÑи на вÑÑÑаиваемÑÑ
              ÑÑÑÑойÑÑваÑ. Ðн ÑÑиÑÑваеÑÑÑ, ÑолÑко еÑли ÑдÑо
              бÑло ÑобÑано Ñ Ð¿Ð¾Ð´Ð´ÐµÑжкой паÑамеÑÑа
              CONFIG_MMAP_ALLOW_UNINITIALIZED. Так как ÑÑоÑ
              паÑамеÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑивеÑÑи к наÑÑÑениÑ
              безопаÑноÑÑи, обÑÑно он ÑÑÑанавливаеÑÑÑ
              ÑолÑко на вÑÑÑаиваемÑÑ ÑÑÑÑойÑÑÐ²Ð°Ñ (Ñо еÑÑÑ,
              ÑÑÑÑойÑÑваÑ, где ÑолÑко один Ñеловек
              Ð¸Ð¼ÐµÐµÑ Ð¿Ð¾Ð»Ð½Ñй конÑÑÐ¾Ð»Ñ Ð½Ð°Ð´ ÑодеÑжимÑм
              полÑзоваÑелÑÑкой памÑÑи).

       Ðз Ñлагов, пеÑеÑиÑленнÑÑ Ð²ÑÑе, в POSIX.1-2001 и
       POSIX.1-2008 опÑеделÑн ÑолÑко MAP_FIXED. Ðднако,
       болÑÑинÑÑво ÑиÑÑем Ñакже поддеÑживаÑÑ
       MAP_ANONYMOUS (или его Ñиноним  MAP_ANON).

       ÐамÑÑÑ, оÑобÑажÑÐ½Ð½Ð°Ñ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ mmap(), ÑоÑÑанÑеÑÑÑ
       пÑи fork(2) Ñ Ñеми же аÑÑибÑÑами.

       Файл оÑобÑажаеÑÑÑ Ð¿Ð¾ кÑаÑÐ½Ð¾Ð¼Ñ ÑазмеÑÑ
       ÑÑÑаниÑÑ. ÐÐ»Ñ Ñайла, коÑоÑÑй не кÑаÑен ÑазмеÑÑ
       ÑÑÑаниÑÑ, оÑÑавÑаÑÑÑ Ð¿Ð°Ð¼ÑÑÑ Ð¿Ñи оÑобÑажении
       заполнÑеÑÑÑ Ð½ÑлÑми, и запиÑÑ Ð² ÑÑÑ Ð¾Ð±Ð»Ð°ÑÑÑ Ð½Ðµ
       пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñайла. ÐейÑÑÐ²Ð¸Ñ Ð¿Ñи
       изменении ÑазмеÑа оÑобÑажаемого Ñайла на
       ÑÑÑаниÑÑ, коÑоÑÑе ÑооÑвеÑÑÑвÑÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð½Ñм
       или ÑдалÑннÑм облаÑÑÑм Ñайла, не
       опÑеделенÑ.

   munmap()
       СиÑÑемнÑй вÑзов munmap() ÑдалÑÐµÑ Ð¾ÑобÑажение
       Ð´Ð»Ñ Ñказанного адÑеÑного диапазона и ÑÑо
       пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº ÑомÑ, ÑÑо далÑнейÑее обÑаÑение по
       адÑеÑам внÑÑÑи диапазона пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº
       генеÑаÑии непÑавилÑнÑÑ ÑÑÑлок на памÑÑÑ.
       Также Ð´Ð»Ñ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð° оÑобÑажение
       авÑомаÑиÑеÑки ÑдалÑеÑÑÑ Ð¿Ñи завеÑÑении ÑабоÑÑ
       пÑоÑеÑÑа. С дÑÑгой ÑÑоÑонÑ, закÑÑÑие Ñайлового
       деÑкÑипÑоÑа не пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº ÑдалениÑ
       оÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð°.

       ÐдÑÐµÑ addr должен бÑÑÑ ÐºÑаÑен ÑазмеÑÑ ÑÑÑаниÑÑ
       (но знаÑÐµÐ½Ð¸Ñ length ÑÑо не каÑаеÑÑÑ). ÐÑе ÑÑÑаниÑÑ,
       ÑодеÑжаÑие ÑаÑÑÑ Ñказанного диапазона,
       ÑдалÑÑÑÑÑ Ð¸Ð· оÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¸ поÑледÑÑÑие ÑÑÑлки
       на ÑÑи ÑÑÑаниÑÑ Ð¿ÑиводÑÑ Ðº генеÑаÑии Ñигнала
       SIGSEGV. ÐÑо не оÑибка, еÑли ÑказаннÑй
       диапазон не ÑодеÑÐ¶Ð¸Ñ ÐºÐ°ÐºÐ¸Ñ-либо
       оÑобÑажÑннÑÑ ÑÑÑаниÑ.

ÐÐÐÐÐ ÐЩÐÐÐÐÐ ÐÐÐЧÐÐÐÐ
       ÐÑи ÑÑпеÑном вÑполнении mmap() возвÑаÑаеÑÑÑ
       ÑказаÑÐµÐ»Ñ Ð½Ð° оÑобÑажÑннÑÑ Ð¾Ð±Ð»Ð°ÑÑÑ. ÐÑи оÑибке
       возвÑаÑаеÑÑÑ Ð·Ð½Ð°Ñение MAP_FAILED (а именно,
       (void *) -1) и  errno ÑÑÑанавливаеÑÑÑ Ð²
       ÑооÑвеÑÑÑвÑÑÑее знаÑение.

       ÐÑи ÑÑпеÑном вÑполнении munmap() возвÑаÑÐ°ÐµÑ 0.
       ÐÑи Ñбои возвÑаÑаеÑÑÑ -1, и код оÑибки
       кладÑÑÑÑ Ð² errno (ÑкоÑее вÑего EINVAL).

ÐШÐÐÐÐ
       EACCES ФайловÑй деÑкÑипÑÐ¾Ñ ÑказÑÐ²Ð°ÐµÑ Ð½Ð° не
              обÑÑнÑй Ñайл. Ðли бÑло запÑоÑено
              оÑобÑажение Ñайла (mapping), но fd не оÑкÑÑÑ
              на ÑÑение. Ðли бÑл Ñказан Ñлаг MAP_SHARED и
              ÑÑÑановлен Ð±Ð¸Ñ PROT_WRITE, но fd не оÑкÑÑÑ Ð²
              Ñежиме ÑÑениÑ/запиÑи (O_RDWR). Ðли бÑл
              Ñказан Ñлаг PROT_WRITE, но Ñайл доÑÑÑпен
              ÑолÑко Ð´Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ.

       EAGAIN Файл заблокиÑован, или блокиÑÑеÑÑÑ
              ÑлиÑком много памÑÑи (ÑмоÑÑиÑе setrlimit(2)).

       EBADF  ÐнаÑение fd не ÑвлÑеÑÑÑ Ð¿ÑавилÑнÑм
              ÑайловÑм деÑкÑипÑоÑом (и MAP_ANONYMOUS не
              ÑÑÑановлен).

       EINVAL ÐепÑавилÑное знаÑение addr, length или offset
              (напÑимеÑ, оно либо ÑлиÑком велико,
              либо не вÑÑовнено по гÑаниÑе ÑÑÑаниÑÑ).

       EINVAL (наÑÐ¸Ð½Ð°Ñ Ñ Linux 2.6.12) ÐнаÑение length Ñавно 0.

       EINVAL ÐнаÑение flags не ÑодеÑÐ¶Ð¸Ñ MAP_PRIVATE или
              MAP_SHARED, или ÑодеÑÐ¶Ð¸Ñ ÑÑÐ°Ð·Ñ ÑÑа ÑÑи Ñлага.

       ENFILE ÐоÑÑигнÑÑо макÑималÑное колиÑеÑÑво
              оÑкÑÑÑÑÑ Ñайлов в ÑиÑÑеме.

       ENODEV ÐÑполÑзÑÐµÐ¼Ð°Ñ ÑÐ°Ð¹Ð»Ð¾Ð²Ð°Ñ ÑиÑÑема длÑ
              Ñказанного Ñайла не поддеÑживаеÑ
              оÑобÑажение памÑÑи.

       ENOMEM ÐолÑÑе Ð½ÐµÑ Ð´Ð¾ÑÑÑпной памÑÑи.

       ENOMEM ÐÑоÑеÑÑ Ð¿ÑевÑÑил Ð±Ñ Ð¾Ð³ÑаниÑение на
              макÑималÑное колиÑеÑÑво оÑобÑажений.
              ÐÑа оÑибка Ñакже Ð¼Ð¾Ð¶ÐµÑ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ½ÑÑÑ Ð²
              munmap() пÑи Ñдалении оÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¾Ð±Ð»Ð°ÑÑи
              в ÑеÑедине ÑÑÑеÑÑвÑÑÑего оÑобÑажениÑ, Ñак
              как пÑи ÑÑом вÑполнÑеÑÑÑ Ñдаление
              оÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð²ÑÑ Ð¾ÑобÑажений менÑÑего
              ÑазмеÑа на лÑбом конÑе облаÑÑи.

       ENOMEM (наÑÐ¸Ð½Ð°Ñ Ñ Linux 4.7) ÐÑло Ð±Ñ Ð¿ÑевÑÑено
              огÑаниÑение пÑоÑеÑÑа RLIMIT_DATA, опиÑанное
              в getrlimit(2).

       EOVERFLOW
              Ðа 32-биÑной аÑÑиÑекÑÑÑе вмеÑÑе Ñ
              ÑаÑÑиÑением Ð´Ð»Ñ Ð±Ð¾Ð»ÑÑÐ¸Ñ Ñайлов (Ñ.е.,
              иÑполÑзÑеÑÑÑ 64-биÑнÑй off_t): колиÑеÑÑво
              ÑÑÑаниÑ, иÑполÑзÑемÑÑ Ð´Ð»Ñ length плÑÑ
              колиÑеÑÑво ÑÑÑаниÑ, иÑполÑзÑемÑÑ Ð´Ð»Ñ offset
              пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº пеÑÐµÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ unsigned long (32
              биÑа).

       EPERM  ÐÑгÑменÑом prot запÑаÑиваеÑÑÑ PROT_EXEC, но
              оÑобÑажÑÐ½Ð½Ð°Ñ Ð¾Ð±Ð»Ð°ÑÑÑ Ð¿ÑÐ¸Ð½Ð°Ð´Ð»ÐµÐ¶Ð¸Ñ ÑайлÑ
              на Ñайловой ÑиÑÑеме, коÑоÑаÑ
              ÑмонÑиÑована Ñ Ñлагом no-exec.

       EPERM  ÐÑполнение опеÑаÑии пÑедоÑвÑаÑено
              опеÑаÑÑванием (file seal); ÑмоÑÑиÑе fcntl(2).

       ETXTBSY
              ÐÑл задан Ñлаг MAP_DENYWRITE, но обÑекÑ,
              ÑказÑваемÑй fd, оÑкÑÑÑ Ð½Ð° запиÑÑ.

       ÐÑи иÑполÑзовании оÑобÑажаемой облаÑÑи
       памÑÑи могÑÑ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°ÑÑ ÑледÑÑÑие ÑигналÑ:

       SIGSEGV
              ÐопÑÑка запиÑи в облаÑÑÑ, оÑобÑажÑннÑÑ
              ÑолÑко Ð´Ð»Ñ ÑÑениÑ.

       SIGBUS ÐопÑÑка доÑÑÑпа к ÑаÑÑи бÑÑеÑа, коÑоÑÐ°Ñ Ð½Ðµ
              ÑÐ¾Ð²Ð¿Ð°Ð´Ð°ÐµÑ Ñайлом (напÑимеÑ, она можеÑ
              наÑодиÑÑÑÑ Ð·Ð° пÑеделами Ñайла.
              Ðодобной ÑвлÑеÑÑÑ ÑиÑÑаÑиÑ, когда дÑÑгой
              пÑоÑеÑÑ ÑменÑÑил Ð´Ð»Ð¸Ð½Ñ Ñайла).

ÐТРÐÐУТЫ
       ÐпиÑание ÑеÑминов данного Ñаздела ÑмоÑÑиÑе
       в attributes(7).

       ┌───────────────────┬────────────────────────────────┬────────────────┐
       │ÐнÑеÑÑÐµÐ¹Ñ      ÐÑÑибÑÑ                      ÐнаÑение │
       ├───────────────────┼────────────────────────────────┼────────────────┤
       │mmap(), munmap()   │ ÐезвÑедноÑÑÑ Ð² ниÑÑÑ │ MT-Safe        │
       └───────────────────┴────────────────────────────────┴────────────────┘
СÐÐТÐÐТСТÐÐРСТÐÐÐÐРТÐÐ
       POSIX.1-2001, POSIX.1-2008, SVr4, 4.4BSD.

ÐÐСТУÐÐÐСТЬ
       Ð ÑиÑÑÐµÐ¼Ð°Ñ POSIX, в коÑоÑÑÑ ÐµÑÑÑ Ð²ÑÐ·Ð¾Ð²Ñ mmap(), msync(2)
       и munmap(), знаÑение _POSIX_MAPPED_FILES,
       опÑеделÑнное в <unistd.h>, болÑÑе 0 (ÑмоÑÑиÑе
       Ñакже sysconf(3)).

ÐÐÐÐЧÐÐÐЯ
       Ðа некоÑоÑÑÑ Ð°ÑÑиÑекÑÑÑÐ°Ñ (напÑимеÑ, i386), Ñлаг
       PROT_WRITE подÑазÑÐ¼ÐµÐ²Ð°ÐµÑ Ñлаг PROT_READ. Также оÑ
       аÑÑиÑекÑÑÑÑ Ð·Ð°Ð²Ð¸ÑÐ¸Ñ Ð¿Ð¾Ð´ÑазÑÐ¼ÐµÐ²Ð°ÐµÑ Ð»Ð¸ PROT_READ
       Ñлаг PROT_EXEC или неÑ. ÐеÑеноÑимÑе пÑогÑаммÑ
       Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²Ñегда ÑÑÑанавливаÑÑ PROT_EXEC, еÑли они
       ÑобиÑаÑÑÑÑ Ð²ÑполнÑÑÑ ÐºÐ¾Ð´, наÑодÑÑийÑÑ Ð²
       оÑобÑажении.

       ÐеÑеноÑимÑй ÑпоÑоб ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¾ÑобÑажениÑ:
       ÑказаÑÑ Ð² addr знаÑение 0 (NULL) и ÑбÑаÑÑ MAP_FIXED из
       flags. Ð ÑÑом ÑлÑÑае, ÑиÑÑема Ñама вÑбеÑÐµÑ Ð°Ð´ÑеÑ
       Ð´Ð»Ñ Ð¾ÑобÑажениÑ; адÑеÑ, вÑбÑаннÑй Ñаким
       обÑазом, не бÑÐ´ÐµÑ Ð±ÑÐ´ÐµÑ ÐºÐ¾Ð½ÑликÑоваÑÑ Ñ
       ÑÑÑеÑÑвÑÑÑими оÑобÑажениÑми и не бÑÐ´ÐµÑ Ñавен
       0. ÐÑли Ñказан Ñлаг MAP_FIXED и знаÑение addr
       Ñавно 0 (NULL), Ñо адÑÐµÑ Ð¾ÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð±ÑÐ´ÐµÑ Ñавен
       0 (NULL).

       ÐекоÑоÑÑе конÑÑанÑÑ flags опÑÐµÐ´ÐµÐ»ÐµÐ½Ñ ÑолÑко,
       еÑли опÑеделÑн подÑодÑÑий макÑоÑ
       ÑеÑÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑвойÑÑв (возможно, по
       ÑмолÑаниÑ): _DEFAULT_SOURCE в glibc 2.19 и новее;
       _BSD_SOURCE или _SVID_SOURCE в glibc 2.19 и ÑÑаÑее (Ñакже
       доÑÑаÑоÑно иÑполÑзоваÑÑ _GNU_SOURCE и ÑÑебоваÑÑ,
       ÑÑÐ¾Ñ Ð¼Ð°ÐºÑÐ¾Ñ Ð»Ð¾Ð³Ð¸Ñно, Ñак как даннÑе Ñлаги
       еÑÑÑ ÑолÑко в Linux). СооÑвеÑÑÑвенно, Ñлаги:
       MAP_32BIT, MAP_ANONYMOUS (и Ñиноним MAP_ANON), MAP_DENYWRITE,
       MAP_EXECUTABLE, MAP_FILE, MAP_GROWSDOWN, MAP_HUGETLB, MAP_LOCKED,
       MAP_NONBLOCK, MAP_NORESERVE, MAP_POPULATE и MAP_STACK.

       ÐÑиложение Ð¼Ð¾Ð¶ÐµÑ Ð¾Ð¿ÑеделиÑÑ ÐºÐ°ÐºÐ¸Ðµ ÑÑÑаниÑÑ
       оÑобÑÐ°Ð¶ÐµÐ½Ñ Ð² даннÑй Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð²
       бÑÑеÑе/ÑÑÑаниÑном кÑÑе Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ mincore(2).

   Ðзменение вÑеменнÑÑ Ð¾ÑмеÑок Ð´Ð»Ñ Ð¾ÑобÑажÑннÑÑ
       Ñайлов
       У оÑобÑажÑннÑÑ Ñайлов поле st_atime можеÑ
       измениÑÑÑÑ Ð² лÑбой Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð¼ÐµÐ¶Ð´Ñ Ð²Ñзовом
       mmap() и ÑооÑвеÑÑÑвÑÑÑим Ñдалением оÑобÑажениÑ;
       пеÑвое обÑаÑение к оÑобÑажÑнной ÑÑÑаниÑе
       пÑиведÑÑ Ðº Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»Ñ, еÑли ÑÑо еÑÑ Ð½Ðµ
       бÑло Ñделано.

       ÐÐ¾Ð»Ñ st_ctime и st_mtime Ñ Ð¾ÑобÑажÑнного Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ
       Ñлагов PROT_WRITE и MAP_SHARED Ñайла бÑдÑÑ
       Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ñ Ð¿Ð¾Ñле запиÑи оÑобÑажÑнной
       облаÑÑи и пеÑед поÑледÑÑÑим вÑзовом msync(2) Ñ
       Ñлагом MS_SYNC или MS_ASYNC, еÑли он бÑÐ´ÐµÑ Ð²Ñзван.

   ÐÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¾Ð³ÑомнÑÑ ÑÑÑÐ°Ð½Ð¸Ñ (Huge TLB)
       ÐÐ»Ñ Ð¾ÑобÑажений, ÑабоÑаÑÑÐ¸Ñ Ñ Ð¾Ð³ÑомнÑми
       ÑÑÑаниÑами, ÑÑÐµÐ±Ð¾Ð²Ð°Ð½Ð¸Ñ Ðº аÑгÑменÑам mmap() и
       munmap() неÑколÑко оÑлиÑаÑÑÑÑ Ð¾Ñ ÑÑебований к
       оÑобÑажениÑм, в коÑоÑÑÑ Ð¸ÑполÑзÑÑÑÑÑ ÑÑÑаниÑÑ Ñ
       ÑиÑÑемнÑм ÑазмеÑом.

       ÐÐ»Ñ mmap(), offset должно бÑÑÑ ÐºÑаÑно ÑазмеÑÑ
       нижележаÑей огÑомной ÑÑÑаниÑÑ. СиÑÑема
       авÑомаÑиÑеÑки вÑÑÐ°Ð²Ð½Ð¸Ð²Ð°ÐµÑ length до кÑаÑного
       знаÑÐµÐ½Ð¸Ñ ÑазмеÑа нижележаÑей огÑомной
       ÑÑÑаниÑÑ.

       ÐÐ»Ñ munmap(), addr и length Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ ÐºÑаÑÐ½Ñ ÑазмеÑÑ
       нижележаÑей огÑомной ÑÑÑаниÑÑ.

   ÐÑлиÑÐ¸Ñ Ð¼ÐµÐ¶Ð´Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñекой C и ÑдÑом
       Рданной ÑÑÑаниÑе опиÑÑваеÑÑÑ Ð¸Ð½ÑеÑÑейÑ,
       пÑедоÑÑавлÑемÑй обÑÑÑоÑной ÑÑнкÑией glibc mmap().
       РанÑÑе, ÑÑа ÑÑнкÑÐ¸Ñ Ð¾Ð±ÑаÑалаÑÑ Ðº ÑиÑÑемномÑ
       вÑÐ·Ð¾Ð²Ñ Ñ Ñем же именем. ÐаÑÐ¸Ð½Ð°Ñ Ñ ÑдÑа 2.4,
       даннÑй ÑиÑÑемнÑй вÑзов бÑл заменÑн на mmap2(2).
       РнаÑÑоÑÑее вÑÐµÐ¼Ñ Ð¾Ð±ÑÑÑоÑÐ½Ð°Ñ ÑÑнкÑÐ¸Ñ glibc, mmap(),
       вÑзÑÐ²Ð°ÐµÑ mmap2(2) Ñ Ð¿Ð¾Ð´ÑодÑÑим
       подкоÑÑекÑиÑованнÑм знаÑением offset.

ÐÐФÐÐТЫ
       Ð Linux не гаÑанÑиÑÑеÑÑÑ ÑезÑлÑÑÐ°Ñ Ñлага MAP_NORESERVE,
       опиÑаннÑй вÑÑе. Ðо ÑмолÑаниÑ, лÑбой пÑоÑеÑÑ
       Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÑинÑдиÑелÑно завеÑÑÑн в лÑбой
       моменÑ, еÑли в ÑиÑÑеме законÑилаÑÑ Ð¿Ð°Ð¼ÑÑÑ.

       Ð ÑдÑÐ°Ñ Ð´Ð¾ веÑÑии 2.6.7 Ñлаг MAP_POPULATE ÑÑиÑÑваеÑÑÑ
       ÑолÑко, еÑли знаÑение prot Ñавно PROT_NONE.

       Ð SUSv3 Ñказано, ÑÑо mmap() должен завеÑÑаÑÑÑÑ Ñ
       оÑибкой, еÑли length Ñавно 0. Ðднако в ÑдÑÐ°Ñ Ð´Ð¾
       веÑÑии 2.6.12 вÑзов mmap() в ÑÑом ÑлÑÑае
       вÑполнÑеÑÑÑ ÑÑпеÑно: оÑобÑажение не ÑоздаÑÑÑÑ
       и вÑзов возвÑаÑÐ°ÐµÑ addr. ÐаÑÐ¸Ð½Ð°Ñ Ñ ÑдÑа веÑÑии
       2.6.12, в ÑÑом ÑлÑÑае вÑзов mmap() завеÑÑаеÑÑÑ Ñ
       оÑибкой EINVAL.

       Ð POSIX Ñказано, ÑÑо ÑиÑÑема вÑегда должна
       заполнÑÑÑ Ð½ÑлÑми лÑбÑÑ ÑаÑÑиÑнÑÑ ÑÑÑаниÑÑ Ñ ÐºÐ¾Ð½Ñа
       обÑекÑа и ÑÑо ÑиÑÑема никогда не должна
       вноÑиÑÑ Ð»ÑбÑе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²Ð½Ðµ пÑеделов
       обÑекÑа. Ð Linux, еÑли Ð²Ñ Ð¿Ð¸ÑиÑе даннÑе в ÑакÑÑ
       ÑаÑÑиÑнÑÑ ÑÑÑаниÑÑ Ð·Ð° конÑом обÑекÑа, Ñо даннÑе
       оÑÑаÑÑÑÑ Ð² ÑÑÑаниÑном кÑÑе даже поÑле закÑÑÑиÑ
       и вÑклÑÑÐµÐ½Ð¸Ñ Ð¾ÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ñайла и ÑоÑÑ Ð´Ð°Ð½Ð½Ñе
       никогда не пиÑÑÑÑÑ Ð² Ñам Ñайл, поÑледÑÑÑие
       оÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ ÑвидеÑÑ Ð¸Ð·Ð¼ÐµÐ½Ñнное
       ÑодеÑжимое. РнекоÑоÑÑÑ ÑлÑÑаÑÑ ÑÑо можно
       иÑпÑавиÑÑ Ð²Ñзвав msync(2) пеÑед вÑклÑÑением
       оÑобÑажениÑ; однако ÑÑо не ÑабоÑÐ°ÐµÑ Ð½Ð° tmpfs(5)
       (напÑимеÑ, когда иÑполÑзÑеÑÑÑ Ð¸Ð½ÑеÑÑÐµÐ¹Ñ Ð¾Ð±Ñей
       памÑÑи POSIX, опиÑаннÑй в shm_overview(7)).

ÐÐ ÐÐÐÐ
       СледÑÑÑÐ°Ñ Ð¿ÑогÑамма вÑÐ²Ð¾Ð´Ð¸Ñ ÑаÑÑÑ Ñайла,
       Ñказанного в пеÑвом аÑгÑменÑе командной
       ÑÑÑоки, в ÑÑандаÑÑнÑй вÑвод. Ðиапазон
       вÑдаваемÑÑ Ð±Ð°Ð¹Ñ Ð·Ð°Ð´Ð°ÑÑÑÑ ÑмеÑением и длиной
       во вÑоÑом и ÑÑеÑÑем аÑгÑменÑÐ°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð½Ð¾Ð¹
       ÑÑÑоки. ÐÑогÑамма ÑоздаÑÑ Ð¾ÑобÑажение
       ÑÑебÑемÑÑ ÑÑÑÐ°Ð½Ð¸Ñ Ñайла и заÑем иÑполÑзÑеÑ
       write(2) Ð´Ð»Ñ Ð²Ñвода запÑоÑеннÑÑ Ð±Ð°Ð¹Ñ.

   ÐÑÑоднÑй код пÑогÑаммÑ
       #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 Ñайл ÑмеÑение [длина]\n", argv[0]);
               exit(EXIT_FAILURE);
           }

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

           if (fstat(fd, &sb) == -1)           /* полÑÑение ÑазмеÑа Ñайла */
               handle_error("fstat");

           offset = atoi(argv[2]);
           pa_offset = offset & ~(sysconf(_SC_PAGE_SIZE) - 1);
               /* Ð´Ð»Ñ mmap() нÑжно вÑÑониÑÑ ÑмеÑение */

           if (offset >= sb.st_size) {
               fprintf(stderr, "Ñказанное ÑмеÑение наÑодиÑÑÑ Ð·Ð° конÑом Ñайла\n");
               exit(EXIT_FAILURE);
           }

           if (argc == 4) {
               length = atoi(argv[3]);
               if (offset + length > sb.st_size)
                   length = sb.st_size - offset;
                       /* ÐелÑÐ·Ñ Ð¿Ð¾ÐºÐ°Ð·Ð°ÑÑ Ð±Ð°Ð¹ÑÑ Ð·Ð° конÑом Ñайла */

           } else {    /* Ðе Ñказана длина ==> показаÑÑ Ð²ÑÑ Ð´Ð¾ конÑа Ñайла */
               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, "ÑаÑÑиÑÐ½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑ");
               exit(EXIT_FAILURE);
           }

           munmap(addr, length + offset - pa_offset);
           close(fd);

           exit(EXIT_SUCCESS);
       }

СÐÐТРÐТРТÐÐÐÐ
       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)

       ÐпиÑание в proc(5) ÑледÑÑÑÐ¸Ñ Ñайлов: /proc/[pid]/maps,
       /proc/[pid]/map_files и /proc/[pid]/smaps.

       B.O. Gallmeister, POSIX.4, O'Reilly, ÑÑÑаниÑÑ 128–129 и 389–391.



Linux                             2017-12-18                           MMAP(2)