| Main index | Section 9 | Options |
#include <sys/param.h>
#include <vm/vm.h>
#include <vm/vm_map.h>
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.
| VM_MAP (9) | July 3, 2018 |
| Main index | Section 9 | Options |
Please direct any comments about this manual page service to Ben Bullock. Privacy policy.
| “ | C is a language that combines all the elegance and power of assembly language with all the readability and maintainability of assembly language. | ” |