|
|
< Previous PageNext Page > |
Each Mach task has its own memory map. In Mach, this memory map takes the form of an ordered doubly linked list. As described in “Mac OS X VM Overview”, each of these objects contains a list of pages and shadow references to other objects.
In general, you should never need to access a memory map directly
unless you are modifying something deep within the VM system. The vm_map_entry
structure
contains task-specific information about an individual mapping along
with a reference to the backing object. In essence, it is the glue
between an VM object and a VM map.
While the details of this data structure are beyond the scope of this document, a few fields are of particular importance.
The field is_submap
is
a Boolean value that tells whether this map entry is a normal VM object
or a submap.
A submap is a collection of mappings that is part of a larger map. Submaps
are often used to group mappings together for the purpose of sharing
them among multiple Mach tasks, but they may be used for many purposes.
What makes a submap particularly powerful is that when several tasks
have mapped a submap into their address space, they can see each
other’s changes, not only to the contents of the objects in the
map, but to the objects themselves. This means that as additional
objects are added to or deleted from the submap, they appear in
or disappear from the address spaces of all tasks that share that
submap.
The field behavior
controls
the paging reference behavior of a specified range in a given map.
This value changes how pageins are clustered. Possible values are VM_BEHAVIOR_DEFAULT
, VM_BEHAVIOR_RANDOM
, VM_BEHAVIOR_SEQUENTIAL
,
and VM_BEHAVIOR_RSEQNTL
,
for default, random, sequential, or reverse-sequential pagein ordering.
The protection
and max_protection
fields
control the permissions on the object. The protection
field
indicates what rights the task currently has for the object, while
the max_protection
field
contains the maximum access that the current task can obtain for
the object.
You might use the protection
field
when debugging shared memory. By setting the protection to be read-only,
any inadvertent writes to the shared memory would cause an exception.
However, when the task actually needs to write to that shared region,
it could increase its permissions in the protection
field
to allow writes.
It would be a security hole if a task could increase
its own permissions on a memory object arbitrarily, however. In
order to preserve a reasonable security model, the task that owns a
memory object must be able to limit the rights granted to a subordinate
task. For this reason, a task is not allowed to increase its protection
beyond the permissions granted in max_protection
.
Possible values for protection
and max_protection
are
described in detail in xnu/osfmk/mach/vm_prot.h
.
Finally, the use_pmap
field
indicates whether a submap’s low-level mappings should be shared
among all tasks into which the submap is mapped. If the mappings
are not shared, then the structure of the map is shared among all
tasks, but the actual contents of the pages are not.
For example, shared libraries are handled with
two submaps. The read-only shared code section has use_pmap
set
to true. The read-write (nonshared) section has use_pmap
set
to false, forcing a clean copy of the library’s DATA
segment
to be mapped in from disk for each new task.
< Previous PageNext Page > |
Last updated: 2006-11-07
|
Get information on Apple products.
Visit the Apple Store online or at retail locations. 1-800-MY-APPLE Copyright © 2007 Apple Inc. All rights reserved. | Terms of use | Privacy Notice |