SYNOPSIS
In sys/param.h In vm/vm.h In vm/vm_map.hDESCRIPTION
The subsystem is used to manage virtual address spaces. This section describes the main data structures used within the code.The Vt 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_submap9 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; #define min_offset header.start #define max_offset header.end };
The fields of Vt struct vm_map are as follows:
- header
- Head node of a circular, doubly linked list of Vt 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.
- min_offset
- The minimum Vt vm_offset_t in this map. Programs should never use header.start or header.end directly, use min_offset and max_offset instead.
- max_offset
- The maximum Vt vm_offset_t in this map.
There is one possible map flag:
- MAP_WIREFUTURE
- Wire all future pages in this map.
The following flags can be passed to vm_map_find9 and vm_map_insert9 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 Vt struct vm_map_entry is a generic representation of a region. The region managed by each entry is associated with a Vt 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 Vt 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 Vt 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 Vt vm_inherit_t . This governs the inheritance behaviour for a map entry during fork processing. The following values are defined for Vt vm_inherit_t :
- VM_INHERIT_SHARE
- The object associated with the entry should be cloned and shared with the new map. A new Vt 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 Vt union vm_map_object is used to specify the structure which a Vt struct vm_map_entry is associated with.
The fields of Vt 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 Vt struct vm_map_entry is backed by a Vt struct vm_object .