отображать или отменять отображение файлов или устройств в память (map or unmap files or devices into memory)
Примечание (Note)
Memory mapped by mmap
() is preserved across fork(2), with the
same attributes.
A file is mapped in multiples of the page size. For a file that
is not a multiple of the page size, the remaining bytes in the
partial page at the end of the mapping are zeroed when mapped,
and modifications to that region are not written out to the file.
The effect of changing the size of the underlying file of a
mapping on the pages that correspond to added or removed regions
of the file is unspecified.
On some hardware architectures (e.g., i386), PROT_WRITE
implies
PROT_READ
. It is architecture dependent whether PROT_READ
implies PROT_EXEC
or not. Portable programs should always set
PROT_EXEC
if they intend to execute code in the new mapping.
The portable way to create a mapping is to specify addr as 0
(NULL), and omit MAP_FIXED
from flags. In this case, the system
chooses the address for the mapping; the address is chosen so as
not to conflict with any existing mapping, and will not be 0. If
the MAP_FIXED
flag is specified, and addr is 0 (NULL), then the
mapped address will be 0 (NULL).
Certain flags constants are defined only if suitable feature test
macros are defined (possibly by default): _DEFAULT_SOURCE
with
glibc 2.19 or later; or _BSD_SOURCE
or _SVID_SOURCE
in glibc 2.19
and earlier. (Employing _GNU_SOURCE
also suffices, and requiring
that macro specifically would have been more logical, since these
flags are all Linux-specific.) The relevant flags are:
MAP_32BIT
, MAP_ANONYMOUS
(and the synonym MAP_ANON
),
MAP_DENYWRITE
, MAP_EXECUTABLE
, MAP_FILE
, MAP_GROWSDOWN
,
MAP_HUGETLB
, MAP_LOCKED
, MAP_NONBLOCK
, MAP_NORESERVE
,
MAP_POPULATE
, and MAP_STACK
.
An application can determine which pages of a mapping are
currently resident in the buffer/page cache using mincore(2).
Using MAP_FIXED safely
The only safe use for MAP_FIXED
is where the address range
specified by addr and length was previously reserved using
another mapping; otherwise, the use of MAP_FIXED
is hazardous
because it forcibly removes preexisting mappings, making it easy
for a multithreaded process to corrupt its own address space.
For example, suppose that thread A looks through /proc/<pid>/maps
in order to locate an unused address range that it can map using
MAP_FIXED
, while thread B simultaneously acquires part or all of
that same address range. When thread A subsequently employs
mmap(MAP_FIXED)
, it will effectively clobber the mapping that
thread B created. In this scenario, thread B need not create a
mapping directly; simply making a library call that, internally,
uses dlopen(3) to load some other shared library, will suffice.
The dlopen(3) call will map the library into the process's
address space. Furthermore, almost any library call may be
implemented in a way that adds memory mappings to the address
space, either with this technique, or by simply allocating
memory. Examples include brk(2), malloc(3), pthread_create(3),
and the PAM libraries ⟨http://www.linux-pam.org⟩.
Since Linux 4.17, a multithreaded program can use the
MAP_FIXED_NOREPLACE
flag to avoid the hazard described above when
attempting to create a mapping at a fixed address that has not
been reserved by a preexisting mapping.
Timestamps changes for file-backed mappings
For file-backed mappings, the st_atime field for the mapped file
may be updated at any time between the mmap
() and the
corresponding unmapping; the first reference to a mapped page
will update the field if it has not been already.
The st_ctime and st_mtime field for a file mapped with PROT_WRITE
and MAP_SHARED
will be updated after a write to the mapped
region, and before a subsequent msync(2) with the MS_SYNC
or
MS_ASYNC
flag, if one occurs.
Huge page (Huge TLB) mappings
For mappings that employ huge pages, the requirements for the
arguments of mmap
() and munmap
() differ somewhat from the
requirements for mappings that use the native system page size.
For mmap
(), offset must be a multiple of the underlying huge page
size. The system automatically aligns length to be a multiple of
the underlying huge page size.
For munmap
(), addr, and length must both be a multiple of the
underlying huge page size.
C library/kernel differences
This page describes the interface provided by the glibc mmap
()
wrapper function. Originally, this function invoked a system
call of the same name. Since kernel 2.4, that system call has
been superseded by mmap2(2), and nowadays the glibc mmap
()
wrapper function invokes mmap2(2) with a suitably adjusted value
for offset.