- NetBSD Manual Pages
UVM_MAP(9) NetBSD Kernel Developer's Manual UVM_MAP(9)
Powered by man-cgi (2021-06-01).
Maintained for NetBSD
by Kimmo Suominen.
Based on man-cgi by Panagiotis Christias.
uvm_map -- virtual address space management interface
uvm_map(struct vm_map *map, vaddr_t *startp, vsize_t size,
struct uvm_object *uobj, voff_t uoffset, vsize_t align,
uvm_unmap(struct vm_map *map, vaddr_t start, vaddr_t end);
uvm_map_pageable(struct vm_map *map, vaddr_t start, vaddr_t end,
bool new_pageable, int lockflags);
uvm_map_checkprot(struct vm_map *map, vaddr_t start, vaddr_t end,
uvm_map_protect(struct vm_map *map, vaddr_t start, vaddr_t end,
vm_prot_t new_prot, bool set_max);
uvm_map_protect_user(struct lwp *l, vaddr_t start, vaddr_t end,
uvm_deallocate(struct vm_map *map, vaddr_t start, vsize_t size);
struct vmspace *
uvmspace_alloc(vaddr_t min, vaddr_t max);
uvmspace_exec(struct lwp *l, vaddr_t start, vaddr_t end);
struct vmspace *
uvmspace_fork(struct vmspace *vm);
uvmspace_free(struct vmspace *vm);
uvmspace_share(struct proc *p1, struct proc *p2);
The UVM facility for virtual address space management.
uvm_map() establishes a valid mapping in map map, which must be unlocked.
The new mapping has size size, which must be a multiple of PAGE_SIZE.
The uobj and uoffset arguments can have four meanings:
· When uobj is NULL and uoffset is UVM_UNKNOWN_OFFSET, uvm_map()
does not use the machine-dependent PMAP_PREFER function.
· When uobj is NULL and uoffset is any other value, it is used as
the hint to PMAP_PREFER.
· When uobj is not NULL and uoffset is UVM_UNKNOWN_OFFSET,
uvm_map() finds the offset based upon the virtual address, passed
· When uobj is not NULL and uoffset is any other value, then a reg-
ular mapping is performed at this offset. The start address of
the map will be returned in startp.
If uobj is supplied, then uvm_map() consumes the caller's reference to
uobj on success; uvm_unmap() will release it when removing this mapping.
On failure, uvm_map() leaves the reference count of uobj unmodified.
align specifies alignment of mapping unless UVM_FLAG_FIXED is specified
in flags. align must be a power of 2.
flags passed to uvm_map() are typically created using the
UVM_MAPFLAG(vm_prot_t prot, vm_prot_t maxprot, vm_inherit_t inh, int
advice, int flags) macro, which uses the following values.
The values that prot and maxprot can take are:
UVM_PROT_NONE No protection bits.
UVM_PROT_MASK Mask to extraction the protection bits.
Additionally, the following constants for ORed values are available:
UVM_PROT_RW, UVM_PROT_RX, UVM_PROT_WX and UVM_PROT_RWX.
The values that inh can take are:
UVM_INH_SHARE Share the map.
UVM_INH_COPY Copy the map.
UVM_INH_NONE No inheritance.
UVM_INH_MASK Mask to extract inherit flags.
The values that advice can take are:
UVM_ADV_NORMAL "Normal" use.
UVM_ADV_RANDOM "Random" access likelihood.
UVM_ADV_SEQUENTIAL "Sequential" access likelihood.
UVM_ADV_MASK Mask to extract the advice flags.
The values that flags can take are:
UVM_FLAG_FIXED Attempt to map on the address specified by
startp. Otherwise, it is used just as a hint.
UVM_FLAG_OVERLAY Establish overlay.
UVM_FLAG_NOMERGE Do not merge map entries, if such merge is possi-
UVM_FLAG_COPYONW Use copy-on-write i.e. do not fault in the pages
UVM_FLAG_AMAPPAD Used for BSS: allocate larger amap, if extending
UVM_FLAG_TRYLOCK Fail if cannot acquire the lock immediately.
UVM_FLAG_NOWAIT Not allowed to sleep. Fail, in such case.
UVM_FLAG_QUANTUM Indicates that map entry cannot be split once
UVM_FLAG_WAITVA Sleep until VA space is available, if it is not.
UVM_FLAG_VAONLY Unmap only VA space. Used by uvm_unmap().
UVM_FLAG_UNMAP Any existing entries in the range for this map-
ping should be unmapped as part of creating the
new mapping. Use of this flag without also spec-
ifying UVM_FLAG_FIXED is a bug.
The UVM_MAPFLAG macro arguments can be combined with an or operator.
There are several special purpose macros for checking protection combina-
tions, e.g., the UVM_PROT_WX. There are also some additional macros to
extract bits from the flags. The UVM_PROTECTION, UVM_INHERIT,
UVM_MAXPROTECTION and UVM_ADVICE macros return the protection, inheri-
tance, maximum protection, and advice, respectively. uvm_map() returns
zero on success or error number otherwise.
uvm_unmap() removes a valid mapping, from start to end, in map map, which
must be unlocked.
uvm_map_pageable() changes the pageability of the pages in the range from
start to end in map map to new_pageable. uvm_map_pageable() returns zero
on success or error number otherwise.
uvm_map_checkprot() checks the protection of the range from start to end
in map map against protection. This returns either true or false.
uvm_map_protect() changes the protection start to end in map map to
new_prot, also setting the maximum protection to the region to new_prot
if set_max is true. This function returns a standard UVM return value.
uvm_map_protect_user() verifies that the new permissions honor PAX
restrictions if applicable and forwards to uvm_map_protect() on passing.
uvm_deallocate() deallocates kernel memory in map map from address start
to start + size.
uvmspace_alloc() allocates and returns a new address space, with ranges
from min to max.
uvmspace_exec() either reuses the address space of thread l (its process)
if there are no other references to it, or creates a new one with
uvmspace_alloc(). The range of valid addresses in the address space is
reset to start through end.
uvmspace_fork() creates and returns a new address space based upon the vm
address space, typically used when allocating an address space for a
uvmspace_free() lowers the reference count on the address space vm, free-
ing the data structures if there are no other references.
uvmspace_share() causes process p2 to share the address space of p1.
uvm_uarea_alloc() allocates memory for a u-area (i.e. kernel stack, PCB,
etc) and returns the address.
uvm_uarea_free() frees a u-area allocated with uvm_uarea_alloc().
uvm_uarea_system_alloc() and uvm_uarea_system_free() are optimized rou-
tines, which are used for kernel threads.
pmap(9), uvm(9), uvm_km(9), vmem(9)
UVM and uvm_map first appeared in NetBSD 1.4.
NetBSD 10.99 May 20, 2017 NetBSD 10.99