Next: Locking Pages, Previous: Resizing the Data Segment, Up: Memory [Contents][Index]
When a page is mapped using mmap
, page protection flags can be
specified using the protection flags argument. See Memory-mapped I/O.
The following flags are available:
PROT_WRITE
The memory can be written to.
PROT_READ
The memory can be read. On some architectures, this flag implies that
the memory can be executed as well (as if PROT_EXEC
had been
specified at the same time).
PROT_EXEC
The memory can be used to store instructions which can then be executed.
On most architectures, this flag implies that the memory can be read (as
if PROT_READ
had been specified).
PROT_NONE
This flag must be specified on its own.
The memory is reserved, but cannot be read, written, or executed. If
this flag is specified in a call to mmap
, a virtual memory area
will be set aside for future use in the process, and mmap
calls
without the MAP_FIXED
flag will not use it for subsequent
allocations. For anonymous mappings, the kernel will not reserve any
physical memory for the allocation at the time the mapping is created.
The operating system may keep track of these flags separately even if
the underlying hardware treats them the same for the purposes of access
checking (as happens with PROT_READ
and PROT_EXEC
on some
platforms). On GNU systems, PROT_EXEC
always implies
PROT_READ
, so that users can view the machine code which is
executing on their system.
Inappropriate access will cause a segfault (see Program Error Signals).
After allocation, protection flags can be changed using the
mprotect
function.
Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.
A successful call to the mprotect
function changes the protection
flags of at least length bytes of memory, starting at
address.
address must be aligned to the page size for the mapping. The
system page size can be obtained by calling sysconf
with the
_SC_PAGESIZE
parameter (see Sysconf Definition). The system
page size is the granularity in which the page protection of anonymous
memory mappings and most file mappings can be changed. Memory which is
mapped from special files or devices may have larger page granularity
than the system page size and may require larger alignment.
length is the number of bytes whose protection flags must be changed. It is automatically rounded up to the next multiple of the system page size.
protection is a combination of the PROT_*
flags described
above.
The mprotect
function returns 0 on success and -1
on failure.
The following errno
error conditions are defined for this
function:
ENOMEM
The system was not able to allocate resources to fulfill the request. This can happen if there is not enough physical memory in the system for the allocation of backing storage. The error can also occur if the new protection flags would cause the memory region to be split from its neighbors, and the process limit for the number of such distinct memory regions would be exceeded.
EINVAL
address is not properly aligned to a page boundary for the mapping, or length (after rounding up to the system page size) is not a multiple of the applicable page size for the mapping, or the combination of flags in protection is not valid.
EACCES
The file for a file-based mapping was not opened with open flags which are compatible with protection.
EPERM
The system security policy does not allow a mapping with the specified
flags. For example, mappings which are both PROT_EXEC
and
PROT_WRITE
at the same time might not be allowed.
If the mprotect
function is used to make a region of memory
inaccessible by specifying the PROT_NONE
protection flag and
access is later restored, the memory retains its previous contents.
On some systems, it may not be possible to specify additional flags which were not present when the mapping was first created. For example, an attempt to make a region of memory executable could fail if the initial protection flags were ‘PROT_READ | PROT_WRITE’.
In general, the mprotect
function can be used to change any
process memory, no matter how it was allocated. However, portable use
of the function requires that it is only used with memory regions
returned by mmap
or mmap64
.
Next: Locking Pages, Previous: Resizing the Data Segment, Up: Memory [Contents][Index]