| United States-English |
|
|
|
![]() |
System Calls and Libraries: Sections 2 and 3 (Ref Pages Vol 3) > mmmap(2) |
|
NAMEmmap — map pages of memory SYNOPSIS#include <sys/mman.h> void *mmap(void *addr, size_t len, int prot, int flags, int fildes, off_t off); DESCRIPTIONNote: This manpage contains HP-UX extensions. The mmap() function establishes a mapping between a process' address space and a file. The format of the call is as follows: pa=mmap(addr, len, prot, flags, fildes, off); The mmap() function establishes a mapping between the process' address space at an address pa for len bytes and the file associated with the file descriptor fildes at offset off for len bytes. The value of pa is an unspecified function of the argument addr and values of flags, further described below. A successful mmap() call returns pa as its result. The address ranges covered by [pa, pa+len] and [off, off+len] must be legitimate for the possible (not necessarily current) address space of a process and the file, respectively. If the size of the mapped file changes after the call to mmap(), the effect of references to portions of the mapped region that correspond to added or removed portions of the file is unspecified. The mmap() function is supported for regular files. Support for any other type of file is unspecified. The prot argument determines whether read, write, execute, or some combination of accesses are permitted to the pages being mapped. The protection options are defined in <sys/mman.h>:
Implementations need not enforce all combinations of access permissions. However, writes shall only be permitted when PROT_WRITE has been set. The flags argument provides other information about the handling of the mapped pages. The options are defined in <sys/mman.h>:
The MAP_PRIVATE and MAP_SHARED flags control the visibility of write references to the memory region. Exactly one of these flags must be specified. The mapping type is retained across a fork(). If MAP_SHARED is set in flags, write references to the memory region by the calling process may change the file and are visible in all MAP_SHARED mappings of the same portion of the file by any process. If MAP_PRIVATE is set in flags, write references to the memory region by the calling process do not change the file and are not visible to any process in other mappings of the same portion of the file. It is unspecified whether write references by processes that have mapped the memory region using MAP_SHARED are visible to processes that have mapped the same portion of the file using MAP_PRIVATE. It is also unspecified whether write references to a memory region mapped with MAP_SHARED are visible to processes reading the file and whether writes to a file are visible to processes that have mapped the modified portion of that file, except for the effect of msync(). When MAP_FIXED is set in the flags argument, the implementation is informed that the value of pa must be addr, exactly. If MAP_FIXED is set, mmap() may return MAP_FAILED and set errno to EINVAL. If a MAP_FIXED request is successful, the mapping established by mmap() replaces any previous mappings for the process' pages in the range [pa, pa+len]. When MAP_FIXED is not set, the implementation uses addr in an unspecified manner to arrive at pa. The pa so chosen will be an area of the address space which the implementation deems suitable for a mapping of len bytes to the file. All implementations interpret an addr value of 0 as granting the implementation complete freedom in selecting pa, subject to constraints described below. A non-zero value of addr is taken to be a suggestion of a process address near which the mapping should be placed. When the implementation selects a value for pa, it never places a mapping at address 0, nor does it replace any extant mapping, nor map into dynamic memory allocation areas. The off argument is constrained to be aligned and sized according to the value returned by sysconf() when passed _SC_PAGESIZE or _SC_PAGE_SIZE. When MAP_FIXED is specified, the argument addr must also meet these constraints. The implementation performs mapping operations over whole pages. Thus, while the argument len need not meet a size or alignment constraint, the implementation will include, in any umapping operation, any partial page specified by the range [pa, pa+len]. The implementation always zero-fills any partial page at the end of a memory region. Further, the implementation never writes out any modified portions of the last page of a file that are beyond the end of the mapped portion of the file. If the mapping established by mmap() extends into pages beyond the page containing the last byte of the file, an application reference to any of the pages in the mapping that are beyond the last page results in the delivery of a SIGBUS or SIGSEGV signal. The mmap() function adds an extra reference to the file associated with the file descriptor fildes which is not removed by a subsequent close() on that file descriptor. This reference is removed when there are no more mappings to the file. The st_atime field of the mapped file may be marked for update at any time between the mmap() call and the corresponding munmap() call. The initial read or write reference to a mapped region will cause the file's st_atime field to be marked for update if it has not already been marked for update. The st_ctime and st_mtime fields of a file that is mapped with MAP_SHARED and PROT_WRITE, will be marked for update at some point in the interval between a write reference to the mapped region and the next call to msync() with MS_ASYNC or MS_SYNC for that portion of the file by any process. If there is no such call, these fields may be marked for update at any time after a write reference if the underlying file is modified as a result. There may be implementation-dependent limits on the number of memory regions that can be mapped (per process or per system). If such a limit is imposed, whether the number of memory regions that can be mapped by a process is decreased by the use of shmat() is implementation-dependent. RETURN VALUEUpon successful completion, mmap() returns the address, (pa), at which the mapping was placed. Otherwise, it returns MAP_FAILED (defined in <sys/mman.h>) and sets errno to indicate the error. ERRORSThe mmap() function will fail if:
APPLICATION USAGEUse of mmap() may reduce the amount of memory available to other memory allocation functions. Use of MAP_FIXED may result in unspecified behaviour in further use of brk(), sbrk(), malloc(), and shmat(). The use of MAP_FIXED is discouraged, as it may prevent an implementation from making the most effective use of resources. The application must ensure correct synchronisation when using mmap() in conjunction with any other file access method, such as read() and write(), standard input/output, and shmat(). The mmap() function allows access to resources via address space manipulations, instead of read()/write(). Once a file is mapped, all a process has to do to access it is use the data at the address to which the file was mapped. So, using pseudo-code to illustrate the way in which an existing program might be changed to use mmap(), the following: fildes = open(...) lseek(fildes, some_offset) read(fildes, buf, len) /* use data in buf */ becomes: fildes = open(...) address = mmap(0, len, PROT_READ, MAP_PRIVATE, fildes, some_offset) /* use data at address */ SEE ALSOexec(2), fcntl(2), fork(2), lockf(2), msync(2), munmap(2), mprotect(2), shmop(2), sysconf(2). |
||||||||||||||||||||||||||||
|
|||||||||||||||