[ Previous | Next | Table of Contents | Index | Library Home |
Legal |
Search ]
Technical Reference: Base Operating System and Extensions, Volume 1
Maps a file-system object into
virtual memory.
Standard C library
(libc.a)
#include <sys/types.h>
#include <sys/mman.h>
void *mmap (addr, len, prot, flags, fildes, off)
void * addr;
size_t len;
int prot, flags, fildes;
off_t off;
Note: The
mmap64 subroutine applies to AIX 4.2 and later
releases.
void *mmap64 (addr, len, prot, flags, fildes, off)
void * addr;
size_t len;
int prot, flags, fildes;
off64_t off;
Note: The
mmap64 subroutine applies to AIX 4.2 and later
releases.
Attention: A
file-system object should not be simultaneously mapped using both the
mmap and shmat subroutines. Unexpected results
may occur when references are made beyond the end of the object.
The mmap subroutine
creates a new mapped file or anonymous memory region by establishing a mapping
between a process-address space and a file-system object. Care needs to
be taken when using the mmap subroutine if the program attempts to
map itself. If the page containing executing instructions is currently
referenced as data through an mmap mapping, the program will hang. Use
the -H4096 binder option, and that will put the executable text on page
boundaries. Then reset the file that contains the executable material,
and view via an mmap mapping.
A region created by the
mmap subroutine cannot be used as the buffer for read or write
operations that involve a device. Similarly, an mmap region
cannot be used as the buffer for operations that require either a pin or xmattach
operation on the buffer.
Modifications to a file-system
object are seen consistently, whether accessed from a mapped file region or
from the read or write subroutine.
Child processes inherit all
mapped regions from the parent process when the fork subroutine is
called. The child process also inherits the same sharing and protection
attributes for these mapped regions. A successful call to any
exec subroutine will unmap all mapped regions created with the
mmap subroutine.
The mmap64 subroutine
is identical to the mmap subroutine except that the starting offset
for the file mapping is specified as a 64-bit value. This permits file
mappings which start beyond OFF_MAX.
In the large file enabled
programming environment, mmap is redefined to be
mmap64.
If the application has requested
SPEC1170 compliant behavior then the st_atime field of the mapped
file is marked for update upon successful completion of the mmap
call.
If the application has requested
SPEC1170 compliant behavior then the st_ctime and
st_mtime fields of a file that is mapped with MAP_SHARED
and PROT_WRITE are marked for update at the next call to
msync subroutine or munmap subroutine if the file has
been modified.
addr
| Specifies the starting address of the memory region to be mapped.
When the MAP_FIXED flag is specified, this address must be a
multiple of the page size returned by the sysconf subroutine using
the _SC_PAGE_SIZE value for the Name parameter. A
region is never placed at address zero, or at an address where it would
overlap an existing region.
|
len
| Specifies the length, in bytes, of the memory region to be mapped.
The system performs mapping operations over whole pages only. If the
len parameter is not a multiple of the page size, the system will
include in any mapping operation the address range between the end of the
region and the end of the page containing the end of the region.
|
prot
| Specifies the access permissions for the mapped region. The
sys/mman.h file defines the following access options:
- PROT_READ
- Region can be read.
- PROT_WRITE
- Region can be written.
- PROT_EXEC
- Region can be executed.
- PROT_NONE
- Region cannot be accessed.
The prot parameter can be
the PROT_NONE flag, or any combination of the PROT_READ
flag, PROT_WRITE flag, and PROT_EXEC flag logically ORed
together. If the PROT_NONE flag is not specified, access
permissions may be granted to the region in addition to those explicitly
requested. However, write access will not be granted unless the
PROT_WRITE flag is specified.
Note: The operating system generates a SIGSEGV
signal if a program attempts an access that exceeds the access permission
given to a memory region. For example, if the PROT_WRITE
flag is not specified and a program attempts a write access, a
SIGSEGV signal results.
If the region is a mapped file that was
mapped with the MAP_SHARED flag, the mmap subroutine
grants read or execute access permission only if the file descriptor used to
map the file was opened for reading. It grants write access permission
only if the file descriptor was opened for writing.
If the region is a mapped file that was
mapped with the MAP_PRIVATE flag, the mmap subroutine
grants read, write, or execute access permission only if the file descriptor
used to map the file was opened for reading. If the region is an
anonymous memory region, the mmap subroutine grants all requested
access permissions.
|
fildes
| Specifies the file descriptor of the file-system object to be
mapped. If the MAP_ANONYMOUS flag is set, the
fildes parameter must be -1. After the successful completion
of the mmap subroutine, the file specified by the fildes
parameter may be closed without effecting the mapped region or the contents of
the mapped file. Each mapped region creates a file reference, similar
to an open file descriptor, which prevents the file data from being
deallocated.
Note: The mmap subroutine supports the mapping of
regular files only. An mmap call that specifies a file
descriptor for a special file fails, returning the ENODEV
error. An example of a file descriptor for a special file is one that
might be used for mapping either I/O or device memory.
|
off
| Specifies the file byte offset at which the mapping starts. This
offset must be a multiple of the page size returned by the sysconf
subroutine using the _SC_PAGE_SIZE value for the Name
parameter.
|
flags
| Specifies attributes of the mapped region. Values for the
flags parameter are constructed by a bitwise-inclusive ORing of
values from the following list of symbolic names defined in the
sys/mman.h file:
- MAP_FILE
- Specifies the creation of a new mapped file region by mapping the file
associated with the fildes file descriptor. The mapped
region can extend beyond the end of the file, both at the time when the
mmap subroutine is called and while the mapping persists.
This situation could occur if a file with no contents was created just before
the call to the mmap subroutine, or if a file was later
truncated. However, references to whole pages following the end of the
file result in the delivery of a SIGBUS signal. Only one of
the MAP_FILE and MAP_ANONYMOUS flags must be specified
with the mmap subroutine.
- MAP_ANONYMOUS
- Specifies the creation of a new, anonymous memory region that is
initialized to all zeros. This memory region can be shared only with
the descendants of the current process. When using this flag, the
fildes parameter must be -1. Only one of the
MAP_FILE and MAP_ANONYMOUS flags must be specified with
the mmap subroutine.
- MAP_ VARIABLE
- Specifies that the system select an address for the new memory region if
the new memory region cannot be mapped at the address specified by the
addr parameter, or if the addr parameter is null.
Only one of the MAP_VARIABLE and MAP_FIXED flags must be
specified with the mmap subroutine.
- MAP_FIXED
- Specifies that the mapped region be placed exactly at the address
specified by the addr parameter. If the application has
requested SPEC1170 complaint behavior and the mmap request is
successful, the mapping replaces any previous mappings for the process'
pages in the specified range. If the application has not requested
SPEC1170 compliant behavior and a previous mapping exists in the range then
the request fails. Only one of the MAP_VARIABLE and
MAP_FIXED flags must be specified with the mmap
subroutine.
- MAP_SHARED
- When the MAP_SHARED flag is set, modifications to the mapped
memory region will be visible to other processes that have mapped the same
region using this flag. If the region is a mapped file region,
modifications to the region will be written to the file.
You can specify only one of the
MAP_SHARED or MAP_PRIVATE flags with the mmap
subroutine. MAP_PRIVATE is the default setting when neither
flag is specified unless you request SPEC1170 compliant behavior. In
this case, you must choose either MAP_SHARED or
MAP_PRIVATE.
|
|
- MAP_PRIVATE
- When the MAP_PRIVATE flag is specified, modifications to the
mapped region by the calling process are not visible to other processes that
have mapped the same region. If the region is a mapped file region,
modifications to the region are not written to the file.
If this flag is specified, the initial
write reference to an object page creates a private copy of that page and
redirects the mapping to the copy. Until then, modifications to the
page by processes that have mapped the same region with the
MAP_SHARED flag are visible.
You can specify only one of the
MAP_SHARED or MAP_PRIVATE flags with the mmap
subroutine. MAP_PRIVATE is the default setting when neither
flag is specified unless you request SPEC1170 compliant behavior. In
this case, you must choose either MAP_SHARED or
MAP_PRIVATE.
|
If successful, the
mmap subroutine returns the address at which the mapping was
placed. Otherwise, it returns -1 and sets the errno global
variable to indicate the error.
Under the following conditions,
the mmap subroutine fails and sets the errno global
variable to:
EACCES
| The file referred to by the fildes parameter is not open for
read access, or the file is not open for write access and the
PROT_WRITE flag was specified for a MAP_SHARED mapping
operation. Or, the file to be mapped has enforced locking enabled and
the file is currently locked.
|
EBADF
| The fildes parameter is not a valid file descriptor, or the
MAP_ANONYMOUS flag was set and the fildes parameter is
not -1.
|
EFBIG
| The mapping requested extends beyond the maximum file size associated
with fildes.
|
EINVAL
| The flags or prot parameter is invalid, or the
addr parameter or off parameter is not a multiple of the
page size returned by the sysconf subroutine using the
_SC_PAGE_SIZE value for the Name parameter.
|
EINVAL
| The application has requested SPEC1170 compliant behavior and the value
of flags is invalid (neither MAP_PRIVATE nor MAP_SHARED
is set).
|
EMFILE
| The application has requested SPEC1170 compliant behavior and the number
of mapped regions would excedd and implementation-dependent limit (per process
or per system).
|
ENODEV
| The fildes parameter refers to an object that cannot be
mapped, such as a terminal.
|
ENOMEM
| There is not enough address space to map len bytes, or the
application has not requested X/Open UNIX95 Specification compliant behavior
and the MAP_FIXED flag was set and part of the address-space range
(addr, addr+len) is already allocated.
|
ENXIO
| The addresses specified by the range (off,
off+len) are invalid for the fildes
parameter.
|
EOVERFLOW
| The mapping requested extends beyond the offset maximum for the file
description associated with fildes.
|
This subroutine is part of Base
Operating System (BOS) Runtime.
The exec (exec: execl, execle, execlp, execv, execve, execvp, or exect Subroutine) subroutine, fork (fork, f_fork, or vfork Subroutine) subroutine, munmap (munmap Subroutine) subroutine, read subroutine, shmat subroutine, sysconf subroutine, write subroutine.
The pin kernel service, xmattach kernel service.
List of Memory
Manipulation Services, List of Memory Mapping
Services, Understanding Memory Mapping in AIX 5L
Version 5.1 General Programming Concepts: Writing and Debugging
Programs.
[ Previous | Next | Table of Contents | Index |
Library Home |
Legal |
Search ]