vm_map (9)
Leading comments
Copyright (c) 2003 Bruce M Simpson <bms@spc.org> All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documenta...
NAME
vm_map - virtual address space portion of virtual memory subsystemSYNOPSIS
In sys/param.h In vm/vm.h In vm/vm_map.hDESCRIPTION
The ifconfig 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 .