vm_map
—
virtual address space portion of virtual memory subsystem
The vm_map
subsystem is used to manage virtual address
spaces. This section describes the main data structures used within the code.
The struct vm_map is a generic
representation of an address space. This address space may belong to a user
process or the kernel. The kernel actually uses several maps, which are
maintained as subordinate maps, created using the
vm_map_submap(9)
function.
struct vm_map {
struct vm_map_entry header;
struct sx lock;
struct mtx system_mtx;
int nentries;
vm_size_t size;
u_int timestamp;
u_char needs_wakeup;
u_char system_map;
vm_flags_t flags;
vm_map_entry_t root;
pmap_t pmap;
int busy;
};
The fields of struct vm_map are as
follows:
- header
- Head node of a circular, doubly linked list of struct
vm_map_entry objects. Each object defines a particular region within
this map's address space.
- lock
- Used to serialize access to the structure.
- system_mtx
- A mutex which is used if the map is a system map.
- nentries
- A count of the members in use within the circular map entry list.
- size
- Specifies the size of the virtual address space.
- timestamp
- Used to determine if the map has changed since its last access.
- needs_wakeup
- Indicates if a thread is waiting for an allocation within the map. Used
only by system maps.
- system_map
- Set to TRUE to indicate that map is a system map; otherwise, it belongs to
a user process.
- flags
- Map flags, described below.
- root
- Root node of a binary search tree used for fast lookup of map
entries.
- pmap
- Pointer to the underlying physical map with which this virtual map is
associated.
- busy
- Map busy counter, prevents forks.
Possible map flags:
MAP_WIREFUTURE
- Wire all future pages in this map.
MAP_BUSY_WAKEUP
- There are waiters for the map busy status.
The following flags can be passed to
vm_map_find(9)
and
vm_map_insert(9)
to specify the copy-on-write properties of regions within the map:
MAP_COPY_ON_WRITE
- The mapping is copy-on-write.
MAP_NOFAULT
- The mapping should not generate page faults.
MAP_PREFAULT
- The mapping should be prefaulted into physical memory.
MAP_PREFAULT_PARTIAL
- The mapping should be partially prefaulted into physical memory.
MAP_DISABLE_SYNCER
- Do not periodically flush dirty pages; only flush them when absolutely
necessary.
MAP_DISABLE_COREDUMP
- Do not include the mapping in a core dump.
MAP_PREFAULT_MADVISE
- Specify that the request is from a user process calling
madvise(2).
MAP_ACC_CHARGED
- Region is already charged to the requestor by some means.
MAP_ACC_NO_CHARGE
- Do not charge for allocated region.
The struct vm_map_entry is a generic
representation of a region. The region managed by each entry is associated
with a union vm_map_object, described below.
struct vm_map_entry {
struct vm_map_entry *prev;
struct vm_map_entry *next;
struct vm_map_entry *left;
struct vm_map_entry *right;
vm_offset_t start;
vm_offset_t end;
vm_offset_t avail_ssize;
vm_size_t adj_free;
vm_size_t max_free;
union vm_map_object object;
vm_ooffset_t offset;
vm_eflags_t eflags;
/* Only in task maps: */
vm_prot_t protection;
vm_prot_t max_protection;
vm_inherit_t inheritance;
int wired_count;
vm_pindex_t lastr;
};
The fields of struct vm_map_entry are as
follows:
- prev
- Pointer to the previous node in a doubly-linked, circular list.
- next
- Pointer to the next node in a doubly-linked, circular list.
- left
- Pointer to the left node in a binary search tree.
- right
- Pointer to the right node in a binary search tree.
- start
- Lower address bound of this entry's region.
- end
- Upper address bound of this entry's region.
- avail_ssize
- If the entry is for a process stack, specifies how much the entry can
grow.
- adj_free
- The amount of free, unmapped address space adjacent to and immediately
following this map entry.
- max_free
- The maximum amount of contiguous free space in this map entry's
subtree.
- object
- Pointer to the struct vm_map_object with which this
entry is associated.
- offset
- Offset within the object which is mapped from
start onwards.
- eflags
- Flags applied to this entry, described below.
The following five members are only valid for entries forming part
of a user process's address space:
- protection
- Memory protection bits applied to this region.
- max_protection
- Mask for the memory protection bits which may be actually be applied to
this region.
- inheritance
- Contains flags which specify how this entry should be treated during fork
processing.
- wired_count
- Count of how many times this entry has been wired into physical
memory.
- lastr
- Contains the address of the last read which caused a page fault.
The following flags may be applied to each entry, by specifying
them as a mask within the eflags member:
MAP_ENTRY_NOSYNC
- The system should not flush the data associated with this map
periodically, but only when it needs to.
MAP_ENTRY_IS_SUB_MAP
- If set, then the object member specifies a
subordinate map.
MAP_ENTRY_COW
- Indicate that this is a copy-on-write region.
MAP_ENTRY_NEEDS_COPY
- Indicate that a copy-on-write region needs to be copied.
MAP_ENTRY_NOFAULT
- Specifies that accesses within this region should never cause a page
fault. If a page fault occurs within this region, the system will
panic.
MAP_ENTRY_USER_WIRED
- Indicate that this region was wired on behalf of a user process.
MAP_ENTRY_BEHAV_NORMAL
- The system should use the default paging behaviour for this region.
MAP_ENTRY_BEHAV_SEQUENTIAL
- The system should depress the priority of pages immediately preceding each
page within this region when faulted in.
MAP_ENTRY_BEHAV_RANDOM
- Is a hint that pages within this region will be accessed randomly, and
that prefetching is likely not advantageous.
MAP_ENTRY_IN_TRANSITION
- Indicate that wiring or unwiring of an entry is in progress, and that
other kernel threads should not attempt to modify fields in the
structure.
MAP_ENTRY_NEEDS_WAKEUP
- Indicate that there are kernel threads waiting for this region to become
available.
MAP_ENTRY_NOCOREDUMP
- The region should not be included in a core dump.
The inheritance member has type
vm_inherit_t. This governs the inheritance behaviour
for a map entry during fork processing. The following values are defined for
vm_inherit_t:
VM_INHERIT_SHARE
- The object associated with the entry should be cloned and shared with the
new map. A new struct vm_object will be created if
necessary.
VM_INHERIT_COPY
- The object associated with the entry should be copied to the new map.
VM_INHERIT_NONE
- The entry should not be copied to the new map.
VM_INHERIT_DEFAULT
- Specifies the default behaviour,
VM_INHERIT_COPY
.
The union vm_map_object is used to specify
the structure which a struct vm_map_entry is
associated with.
The fields of union vm_map_object are as
follows:
union vm_map_object {
struct vm_object *vm_object;
struct vm_map *sub_map;
};
Normally, the sub_map member is only used by
system maps to indicate that a memory range is managed by a subordinate
system map. Within a user process map, each struct
vm_map_entry is backed by a struct
vm_object.
pmap(9),
vm_map_check_protection(9),
vm_map_delete(9),
vm_map_entry_resize_free(9),
vm_map_find(9),
vm_map_findspace(9),
vm_map_inherit(9),
vm_map_init(9),
vm_map_insert(9),
vm_map_lock(9),
vm_map_lookup(9),
vm_map_madvise(9),
vm_map_max(9),
vm_map_min(9),
vm_map_pmap(9),
vm_map_protect(9),
vm_map_remove(9),
vm_map_simplify_entry(9),
vm_map_stack(9),
vm_map_submap(9),
vm_map_sync(9),
vm_map_wire(9)
This manual page was written by Bruce M Simpson
<bms@spc.org>.