diff options
| author | Jacob McDonnell <jacob@jacobmcdonnell.com> | 2026-04-25 19:59:05 -0400 |
|---|---|---|
| committer | Jacob McDonnell <jacob@jacobmcdonnell.com> | 2026-04-25 19:59:05 -0400 |
| commit | 1f19f33e45791ea59aed048796fc68672c6723a5 (patch) | |
| tree | 54625fba89e91d1c2177801ec635e8528bba937f /static/netbsd/man9/uvm.9 3.html | |
| parent | ac5e55f5f2af5b92794c2aded46c6bae85b5f5ed (diff) | |
docs: Removed Precompiled HTML
Diffstat (limited to 'static/netbsd/man9/uvm.9 3.html')
| -rw-r--r-- | static/netbsd/man9/uvm.9 3.html | 580 |
1 files changed, 0 insertions, 580 deletions
diff --git a/static/netbsd/man9/uvm.9 3.html b/static/netbsd/man9/uvm.9 3.html deleted file mode 100644 index 19108045..00000000 --- a/static/netbsd/man9/uvm.9 3.html +++ /dev/null @@ -1,580 +0,0 @@ -<table class="head"> - <tr> - <td class="head-ltitle">UVM(9)</td> - <td class="head-vol">Kernel Developer's Manual</td> - <td class="head-rtitle">UVM(9)</td> - </tr> -</table> -<div class="manual-text"> -<section class="Sh"> -<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1> -<p class="Pp"><code class="Nm">uvm</code> — <span class="Nd">virtual - memory system external interface</span></p> -</section> -<section class="Sh"> -<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1> -<p class="Pp"><code class="In">#include - <<a class="In">sys/param.h</a>></code> - <br/> - <code class="In">#include <<a class="In">uvm/uvm.h</a>></code></p> -</section> -<section class="Sh"> -<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1> -<p class="Pp">The UVM virtual memory system manages access to the computer's - memory resources. User processes and the kernel access these resources - through UVM's external interface. UVM's external interface includes - functions that:</p> -<p class="Pp"></p> -<ul class="Bl-dash Bl-compact"> - <li>initialize UVM sub-systems</li> - <li>manage virtual address spaces</li> - <li>resolve page faults</li> - <li>memory map files and devices</li> - <li>perform uio-based I/O to virtual memory</li> - <li>allocate and free kernel virtual memory</li> - <li>allocate and free physical memory</li> -</ul> -<p class="Pp">In addition to exporting these services, UVM has two kernel-level - processes: pagedaemon and swapper. The pagedaemon process sleeps until - physical memory becomes scarce. When that happens, pagedaemon is awoken. It - scans physical memory, paging out and freeing memory that has not been - recently used. The swapper process swaps in runnable processes that are - currently swapped out, if there is room.</p> -<p class="Pp">There are also several miscellaneous functions.</p> -</section> -<section class="Sh"> -<h1 class="Sh" id="INITIALIZATION"><a class="permalink" href="#INITIALIZATION">INITIALIZATION</a></h1> -<dl class="Bl-ohang"> - <dt id="uvm_init"><var class="Ft">void</var></dt> - <dd><a class="permalink" href="#uvm_init"><code class="Fn">uvm_init</code></a>(<var class="Fa">void</var>);</dd> - <dt><var class="Ft">void</var></dt> - <dd><code class="Fn">uvm_init_limits</code>(<var class="Fa">struct lwp - *l</var>);</dd> - <dt><var class="Ft">void</var></dt> - <dd><code class="Fn">uvm_setpagesize</code>(<var class="Fa">void</var>);</dd> - <dt><var class="Ft">void</var></dt> - <dd><code class="Fn">uvm_swap_init</code>(<var class="Fa">void</var>);</dd> -</dl> -<p class="Pp" id="uvm_init~2"><a class="permalink" href="#uvm_init~2"><code class="Fn">uvm_init</code></a>() - sets up the UVM system at system boot time, after the console has been - setup. It initializes global state, the page, map, kernel virtual memory - state, machine-dependent physical map, kernel memory allocator, pager and - anonymous memory sub-systems, and then enables paging of kernel objects.</p> -<p class="Pp" id="uvm_init_limits"><a class="permalink" href="#uvm_init_limits"><code class="Fn">uvm_init_limits</code></a>() - initializes process limits for the named process. This is for use by the - system startup for process zero, before any other processes are created.</p> -<p class="Pp" id="uvm_md_init"><a class="permalink" href="#uvm_md_init"><code class="Fn">uvm_md_init</code></a>() - does early boot initialization. This currently includes: - <a class="permalink" href="#uvm_setpagesize"><code class="Fn" id="uvm_setpagesize">uvm_setpagesize</code></a>() - which initializes the uvmexp members pagesize (if not already done by - machine-dependent code), pageshift and pagemask. - <a class="permalink" href="#uvm_physseg_init"><code class="Fn" id="uvm_physseg_init">uvm_physseg_init</code></a>() - which initialises the <a class="Xr">uvm_hotplug(9)</a> subsystem. It should - be called by machine-dependent code early in the - <a class="permalink" href="#pmap_init"><code class="Fn" id="pmap_init">pmap_init</code></a>() - call (see <a class="Xr">pmap(9)</a>).</p> -<p class="Pp" id="uvm_swap_init"><a class="permalink" href="#uvm_swap_init"><code class="Fn">uvm_swap_init</code></a>() - initializes the swap sub-system.</p> -</section> -<section class="Sh"> -<h1 class="Sh" id="VIRTUAL_ADDRESS_SPACE_MANAGEMENT"><a class="permalink" href="#VIRTUAL_ADDRESS_SPACE_MANAGEMENT">VIRTUAL - ADDRESS SPACE MANAGEMENT</a></h1> -<p class="Pp">See <a class="Xr">uvm_map(9)</a>.</p> -</section> -<section class="Sh"> -<h1 class="Sh" id="PAGE_FAULT_HANDLING"><a class="permalink" href="#PAGE_FAULT_HANDLING">PAGE - FAULT HANDLING</a></h1> -<dl class="Bl-ohang"> - <dt><var class="Ft">int</var></dt> - <dd><code class="Fn">uvm_fault</code>(<var class="Fa">struct vm_map - *orig_map</var>, <var class="Fa">vaddr_t vaddr</var>, - <var class="Fa">vm_prot_t access_type</var>);</dd> -</dl> -<p class="Pp" id="uvm_fault"><a class="permalink" href="#uvm_fault"><code class="Fn">uvm_fault</code></a>() - is the main entry point for faults. It takes <var class="Fa">orig_map</var> - as the map the fault originated in, a <var class="Fa">vaddr</var> offset - into the map the fault occurred, and <var class="Fa">access_type</var> - describing the type of access requested. <code class="Fn">uvm_fault</code>() - returns a standard UVM return value.</p> -</section> -<section class="Sh"> -<h1 class="Sh" id="MEMORY_MAPPING_FILES_AND_DEVICES"><a class="permalink" href="#MEMORY_MAPPING_FILES_AND_DEVICES">MEMORY - MAPPING FILES AND DEVICES</a></h1> -<p class="Pp">See <a class="Xr">ubc(9)</a>.</p> -</section> -<section class="Sh"> -<h1 class="Sh" id="VIRTUAL_MEMORY_I/O"><a class="permalink" href="#VIRTUAL_MEMORY_I/O">VIRTUAL - MEMORY I/O</a></h1> -<dl class="Bl-ohang"> - <dt><var class="Ft">int</var></dt> - <dd><code class="Fn">uvm_io</code>(<var class="Fa">struct vm_map *map</var>, - <var class="Fa">struct uio *uio</var>);</dd> -</dl> -<p class="Pp" id="uvm_io"><a class="permalink" href="#uvm_io"><code class="Fn">uvm_io</code></a>() - performs the I/O described in <var class="Fa">uio</var> on the memory - described in <var class="Fa">map</var>.</p> -</section> -<section class="Sh"> -<h1 class="Sh" id="ALLOCATION_OF_KERNEL_MEMORY"><a class="permalink" href="#ALLOCATION_OF_KERNEL_MEMORY">ALLOCATION - OF KERNEL MEMORY</a></h1> -<p class="Pp">See <a class="Xr">uvm_km(9)</a>.</p> -</section> -<section class="Sh"> -<h1 class="Sh" id="ALLOCATION_OF_PHYSICAL_MEMORY"><a class="permalink" href="#ALLOCATION_OF_PHYSICAL_MEMORY">ALLOCATION - OF PHYSICAL MEMORY</a></h1> -<dl class="Bl-ohang"> - <dt><var class="Ft">struct vm_page *</var></dt> - <dd><code class="Fn">uvm_pagealloc</code>(<var class="Fa">struct uvm_object - *uobj</var>, <var class="Fa">voff_t off</var>, <var class="Fa">struct - vm_anon *anon</var>, <var class="Fa">int flags</var>);</dd> - <dt><var class="Ft">void</var></dt> - <dd><code class="Fn">uvm_pagerealloc</code>(<var class="Fa">struct vm_page - *pg</var>, <var class="Fa">struct uvm_object *newobj</var>, - <var class="Fa">voff_t newoff</var>);</dd> - <dt><var class="Ft">void</var></dt> - <dd><code class="Fn">uvm_pagefree</code>(<var class="Fa">struct vm_page - *pg</var>);</dd> - <dt><var class="Ft">int</var></dt> - <dd><code class="Fn">uvm_pglistalloc</code>(<var class="Fa">psize_t - size</var>, <var class="Fa">paddr_t low</var>, <var class="Fa">paddr_t - high</var>, <var class="Fa">paddr_t alignment</var>, - <var class="Fa">paddr_t boundary</var>, <var class="Fa">struct pglist - *rlist</var>, <var class="Fa">int nsegs</var>, <var class="Fa">int - waitok</var>);</dd> - <dt><var class="Ft">void</var></dt> - <dd><code class="Fn">uvm_pglistfree</code>(<var class="Fa">struct pglist - *list</var>);</dd> - <dt><var class="Ft">void</var></dt> - <dd><code class="Fn">uvm_page_physload</code>(<var class="Fa">paddr_t - start</var>, <var class="Fa">paddr_t end</var>, <var class="Fa">paddr_t - avail_start</var>, <var class="Fa">paddr_t avail_end</var>, - <var class="Fa">int free_list</var>);</dd> -</dl> -<p class="Pp" id="uvm_pagealloc"><a class="permalink" href="#uvm_pagealloc"><code class="Fn">uvm_pagealloc</code></a>() - allocates a page of memory at virtual address <var class="Fa">off</var> in - either the object <var class="Fa">uobj</var> or the anonymous memory - <var class="Fa">anon</var>, which must be locked by the caller. Only one of - <var class="Fa">uobj</var> and <var class="Fa">anon</var> can be non - <code class="Dv">NULL</code>. Returns <code class="Dv">NULL</code> when no - page can be found. The flags can be any of</p> -<div class="Bd Pp Li"> -<pre>#define UVM_PGA_USERESERVE 0x0001 /* ok to use reserve pages */ -#define UVM_PGA_ZERO 0x0002 /* returned page must be zero'd */</pre> -</div> -<p class="Pp"><code class="Dv">UVM_PGA_USERESERVE</code> means to allocate a - page even if that will result in the number of free pages being lower than - <code class="Dv">uvmexp.reserve_pagedaemon</code> (if the current thread is - the pagedaemon) or <code class="Dv">uvmexp.reserve_kernel</code> (if the - current thread is not the pagedaemon). <code class="Dv">UVM_PGA_ZERO</code> - causes the returned page to be filled with zeroes, either by allocating it - from a pool of pre-zeroed pages or by zeroing it in-line as necessary.</p> -<p class="Pp" id="uvm_pagerealloc"><a class="permalink" href="#uvm_pagerealloc"><code class="Fn">uvm_pagerealloc</code></a>() - reallocates page <var class="Fa">pg</var> to a new object - <var class="Fa">newobj</var>, at a new offset - <var class="Fa">newoff</var>.</p> -<p class="Pp" id="uvm_pagefree"><a class="permalink" href="#uvm_pagefree"><code class="Fn">uvm_pagefree</code></a>() - frees the physical page <var class="Fa">pg</var>. If the content of the page - is known to be zero-filled, caller should set - <code class="Dv">PG_ZERO</code> in pg->flags so that the page allocator - will use the page to serve future <code class="Dv">UVM_PGA_ZERO</code> - requests efficiently.</p> -<p class="Pp" id="uvm_pglistalloc"><a class="permalink" href="#uvm_pglistalloc"><code class="Fn">uvm_pglistalloc</code></a>() - allocates a list of pages for size <var class="Fa">size</var> byte under - various constraints. <var class="Fa">low</var> and - <var class="Fa">high</var> describe the lowest and highest addresses - acceptable for the list. If <var class="Fa">alignment</var> is non-zero, it - describes the required alignment of the list, in power-of-two notation. If - <var class="Fa">boundary</var> is non-zero, no segment of the list may cross - this power-of-two boundary, relative to zero. <var class="Fa">nsegs</var> is - the maximum number of physically contiguous segments. If - <var class="Fa">waitok</var> is non-zero, the function may sleep until - enough memory is available. (It also may give up in some situations, so a - non-zero <var class="Fa">waitok</var> does not imply that - <code class="Fn">uvm_pglistalloc</code>() cannot return an error.) The - allocated memory is returned in the <var class="Fa">rlist</var> list; the - caller has to provide storage only, the list is initialized by - <code class="Fn">uvm_pglistalloc</code>().</p> -<p class="Pp" id="uvm_pglistfree"><a class="permalink" href="#uvm_pglistfree"><code class="Fn">uvm_pglistfree</code></a>() - frees the list of pages pointed to by <var class="Fa">list</var>. If the - content of the page is known to be zero-filled, caller should set - <code class="Dv">PG_ZERO</code> in pg->flags so that the page allocator - will use the page to serve future <code class="Dv">UVM_PGA_ZERO</code> - requests efficiently.</p> -<p class="Pp" id="uvm_page_physload"><a class="permalink" href="#uvm_page_physload"><code class="Fn">uvm_page_physload</code></a>() - loads physical memory segments into VM space on the specified - <var class="Fa">free_list</var>. It must be called at system boot time to - set up physical memory management pages. The arguments describe the - <var class="Fa">start</var> and <var class="Fa">end</var> of the physical - addresses of the segment, and the available start and end addresses of pages - not already in use. If a system has memory banks of different speeds the - slower memory should be given a higher <var class="Fa">free_list</var> - value.</p> -</section> -<section class="Sh"> -<h1 class="Sh" id="PROCESSES"><a class="permalink" href="#PROCESSES">PROCESSES</a></h1> -<dl class="Bl-ohang"> - <dt><var class="Ft">void</var></dt> - <dd><code class="Fn">uvm_pageout</code>(<var class="Fa">void</var>);</dd> - <dt><var class="Ft">void</var></dt> - <dd><code class="Fn">uvm_scheduler</code>(<var class="Fa">void</var>);</dd> -</dl> -<p class="Pp" id="uvm_pageout"><a class="permalink" href="#uvm_pageout"><code class="Fn">uvm_pageout</code></a>() - is the main loop for the page daemon.</p> -<p class="Pp" id="uvm_scheduler"><a class="permalink" href="#uvm_scheduler"><code class="Fn">uvm_scheduler</code></a>() - is the process zero main loop, which is to be called after the system has - finished starting other processes. It handles the swapping in of runnable, - swapped out processes in priority order.</p> -</section> -<section class="Sh"> -<h1 class="Sh" id="PAGE_LOAN"><a class="permalink" href="#PAGE_LOAN">PAGE - LOAN</a></h1> -<dl class="Bl-ohang"> - <dt><var class="Ft">int</var></dt> - <dd><code class="Fn">uvm_loan</code>(<var class="Fa">struct vm_map *map</var>, - <var class="Fa">vaddr_t start</var>, <var class="Fa">vsize_t len</var>, - <var class="Fa">void *v</var>, <var class="Fa">int flags</var>);</dd> - <dt><var class="Ft">void</var></dt> - <dd><code class="Fn">uvm_unloan</code>(<var class="Fa">void *v</var>, - <var class="Fa">int npages</var>, <var class="Fa">int flags</var>);</dd> -</dl> -<p class="Pp" id="uvm_loan"><a class="permalink" href="#uvm_loan"><code class="Fn">uvm_loan</code></a>() - loans pages in a map out to anons or to the kernel. - <var class="Fa">map</var> should be unlocked, <var class="Fa">start</var> - and <var class="Fa">len</var> should be multiples of - <code class="Dv">PAGE_SIZE</code>. Argument <var class="Fa">flags</var> - should be one of</p> -<div class="Bd Pp Li"> -<pre>#define UVM_LOAN_TOANON 0x01 /* loan to anons */ -#define UVM_LOAN_TOPAGE 0x02 /* loan to kernel */</pre> -</div> -<p class="Pp" id="uvm_loan~2"><var class="Fa">v</var> should be pointer to array - of pointers to <code class="Li">struct anon</code> or - <code class="Li">struct vm_page</code>, as appropriate. The caller has to - allocate memory for the array and ensure it's big enough to hold - <var class="Fa">len / PAGE_SIZE</var> pointers. Returns 0 for success, or - appropriate error number otherwise. Note that wired pages can't be loaned - out and - <a class="permalink" href="#uvm_loan~2"><code class="Fn">uvm_loan</code></a>() - will fail in that case.</p> -<p class="Pp" id="uvm_unloan"><a class="permalink" href="#uvm_unloan"><code class="Fn">uvm_unloan</code></a>() - kills loans on pages or anons. The <var class="Fa">v</var> must point to the - array of pointers initialized by previous call to - <code class="Fn">uvm_loan</code>(). <var class="Fa">npages</var> should - match number of pages allocated for loan, this also matches number of items - in the array. Argument <var class="Fa">flags</var> should be one of</p> -<div class="Bd Pp Li"> -<pre>#define UVM_LOAN_TOANON 0x01 /* loan to anons */ -#define UVM_LOAN_TOPAGE 0x02 /* loan to kernel */</pre> -</div> -<p class="Pp" id="uvm_loan~3">and should match what was used for previous call - to - <a class="permalink" href="#uvm_loan~3"><code class="Fn">uvm_loan</code></a>().</p> -</section> -<section class="Sh"> -<h1 class="Sh" id="MISCELLANEOUS_FUNCTIONS"><a class="permalink" href="#MISCELLANEOUS_FUNCTIONS">MISCELLANEOUS - FUNCTIONS</a></h1> -<dl class="Bl-ohang"> - <dt><var class="Ft">struct uvm_object *</var></dt> - <dd><code class="Fn">uao_create</code>(<var class="Fa">vsize_t size</var>, - <var class="Fa">int flags</var>);</dd> - <dt><var class="Ft">void</var></dt> - <dd><code class="Fn">uao_detach</code>(<var class="Fa">struct uvm_object - *uobj</var>);</dd> - <dt><var class="Ft">void</var></dt> - <dd><code class="Fn">uao_reference</code>(<var class="Fa">struct uvm_object - *uobj</var>);</dd> - <dt><var class="Ft">bool</var></dt> - <dd><code class="Fn">uvm_chgkprot</code>(<var class="Fa">void *addr</var>, - <var class="Fa">size_t len</var>, <var class="Fa">int rw</var>);</dd> - <dt><var class="Ft">void</var></dt> - <dd><code class="Fn">uvm_kernacc</code>(<var class="Fa">void *addr</var>, - <var class="Fa">size_t len</var>, <var class="Fa">int rw</var>);</dd> - <dt><var class="Ft">int</var></dt> - <dd><code class="Fn">uvm_vslock</code>(<var class="Fa">struct vmspace - *vs</var>, <var class="Fa">void *addr</var>, <var class="Fa">size_t - len</var>, <var class="Fa">vm_prot_t prot</var>);</dd> - <dt><var class="Ft">void</var></dt> - <dd><code class="Fn">uvm_vsunlock</code>(<var class="Fa">struct vmspace - *vs</var>, <var class="Fa">void *addr</var>, <var class="Fa">size_t - len</var>);</dd> - <dt><var class="Ft">void</var></dt> - <dd><code class="Fn">uvm_meter</code>(<var class="Fa">void</var>);</dd> - <dt><var class="Ft">void</var></dt> - <dd><code class="Fn">uvm_proc_fork</code>(<var class="Fa">struct proc - *p1</var>, <var class="Fa">struct proc *p2</var>, <var class="Fa">bool - shared</var>);</dd> - <dt><var class="Ft">int</var></dt> - <dd><code class="Fn">uvm_grow</code>(<var class="Fa">struct proc *p</var>, - <var class="Fa">vaddr_t sp</var>);</dd> - <dt><var class="Ft">void</var></dt> - <dd><code class="Fn">uvn_findpages</code>(<var class="Fa">struct uvm_object - *uobj</var>, <var class="Fa">voff_t offset</var>, <var class="Fa">int - *npagesp</var>, <var class="Fa">struct vm_page **pps</var>, - <var class="Fa">int flags</var>);</dd> - <dt><var class="Ft">void</var></dt> - <dd><code class="Fn">uvm_vnp_setsize</code>(<var class="Fa">struct vnode - *vp</var>, <var class="Fa">voff_t newsize</var>);</dd> -</dl> -<p class="Pp" id="uao_create">The - <a class="permalink" href="#uao_create"><code class="Fn">uao_create</code></a>(), - <a class="permalink" href="#uao_detach"><code class="Fn" id="uao_detach">uao_detach</code></a>(), - and <code class="Fn">uao_reference</code>() functions operate on anonymous - memory objects, such as those used to support System V shared memory. - <code class="Fn">uao_create</code>() returns an object of size - <var class="Fa">size</var> with flags:</p> -<div class="Bd Pp Li"> -<pre>#define UAO_FLAG_KERNOBJ 0x1 /* create kernel object */ -#define UAO_FLAG_KERNSWAP 0x2 /* enable kernel swap */</pre> -</div> -<p class="Pp" id="uao_reference">which can only be used once each at system boot - time. - <a class="permalink" href="#uao_reference"><code class="Fn">uao_reference</code></a>() - creates an additional reference to the named anonymous memory object. - <a class="permalink" href="#uao_detach~2"><code class="Fn" id="uao_detach~2">uao_detach</code></a>() - removes a reference from the named anonymous memory object, destroying it if - removing the last reference.</p> -<p class="Pp" id="uvm_chgkprot"><a class="permalink" href="#uvm_chgkprot"><code class="Fn">uvm_chgkprot</code></a>() - changes the protection of kernel memory from <var class="Fa">addr</var> to - <var class="Fa">addr + len</var> to the value of <var class="Fa">rw</var>. - This is primarily useful for debuggers, for setting breakpoints. This - function is only available with options <code class="Dv">KGDB</code>.</p> -<p class="Pp" id="uvm_kernacc"><a class="permalink" href="#uvm_kernacc"><code class="Fn">uvm_kernacc</code></a>() - checks the access at address <var class="Fa">addr</var> to - <var class="Fa">addr + len</var> for <var class="Fa">rw</var> access in the - kernel address space.</p> -<p class="Pp" id="uvm_vslock"><a class="permalink" href="#uvm_vslock"><code class="Fn">uvm_vslock</code></a>() - and - <a class="permalink" href="#uvm_vsunlock"><code class="Fn" id="uvm_vsunlock">uvm_vsunlock</code></a>() - control the wiring and unwiring of pages for process <var class="Fa">p</var> - from <var class="Fa">addr</var> to <var class="Fa">addr + len</var>. These - functions are normally used to wire memory for I/O.</p> -<p class="Pp" id="uvm_meter"><a class="permalink" href="#uvm_meter"><code class="Fn">uvm_meter</code></a>() - calculates the load average.</p> -<p class="Pp" id="uvm_proc_fork"><a class="permalink" href="#uvm_proc_fork"><code class="Fn">uvm_proc_fork</code></a>() - forks a virtual address space for process' (old) <var class="Fa">p1</var> - and (new) <var class="Fa">p2</var>. If the <var class="Fa">shared</var> - argument is non zero, p1 shares its address space with p2, otherwise a new - address space is created. This function currently has no return value, and - thus cannot fail. In the future, this function will be changed to allow it - to fail in low memory conditions.</p> -<p class="Pp" id="uvm_grow"><a class="permalink" href="#uvm_grow"><code class="Fn">uvm_grow</code></a>() - increases the stack segment of process <var class="Fa">p</var> to include - <var class="Fa">sp</var>.</p> -<p class="Pp" id="uvn_findpages"><a class="permalink" href="#uvn_findpages"><code class="Fn">uvn_findpages</code></a>() - looks up or creates pages in <var class="Fa">uobj</var> at offset - <var class="Fa">offset</var>, marks them busy and returns them in the - <var class="Fa">pps</var> array. Currently <var class="Fa">uobj</var> must - be a vnode object. The number of pages requested is pointed to by - <var class="Fa">npagesp</var>, and this value is updated with the actual - number of pages returned. The flags can be any bitwise inclusive-or of:</p> -<p class="Pp"></p> -<div class="Bd-indent"> -<dl class="Bl-tag Bl-compact"> - <dt id="UFP_ALL"><a class="permalink" href="#UFP_ALL"><code class="Dv">UFP_ALL</code></a></dt> - <dd>Zero pseudo-flag meaning return all pages.</dd> - <dt id="UFP_NOWAIT"><a class="permalink" href="#UFP_NOWAIT"><code class="Dv">UFP_NOWAIT</code></a></dt> - <dd>Don't sleep — yield <code class="Dv">NULL</code> for busy pages or - for uncached pages for which allocation would sleep.</dd> - <dt id="UFP_NOALLOC"><a class="permalink" href="#UFP_NOALLOC"><code class="Dv">UFP_NOALLOC</code></a></dt> - <dd>Don't allocate — yield <code class="Dv">NULL</code> for uncached - pages.</dd> - <dt id="UFP_NOCACHE"><a class="permalink" href="#UFP_NOCACHE"><code class="Dv">UFP_NOCACHE</code></a></dt> - <dd>Don't use cached pages — yield <code class="Dv">NULL</code> - instead.</dd> - <dt id="UFP_NORDONLY"><a class="permalink" href="#UFP_NORDONLY"><code class="Dv">UFP_NORDONLY</code></a></dt> - <dd>Don't yield read-only pages — yield <code class="Dv">NULL</code> - for pages marked <code class="Dv">PG_READONLY</code>.</dd> - <dt id="UFP_DIRTYONLY"><a class="permalink" href="#UFP_DIRTYONLY"><code class="Dv">UFP_DIRTYONLY</code></a></dt> - <dd>Don't yield clean pages — stop early at the first clean one. As a - side effect, mark yielded dirty pages clean. Caller must write them to - permanent storage before unbusying.</dd> - <dt id="UFP_BACKWARD"><a class="permalink" href="#UFP_BACKWARD"><code class="Dv">UFP_BACKWARD</code></a></dt> - <dd>Traverse pages in reverse order. If - <a class="permalink" href="#uvn_findpages~2"><code class="Fn" id="uvn_findpages~2">uvn_findpages</code></a>() - returns early, it will have filled - <code class="Li">*</code><var class="Fa">npagesp</var> entries at the end - of <var class="Fa">pps</var> rather than the beginning.</dd> -</dl> -</div> -<p class="Pp" id="uvm_vnp_setsize"><a class="permalink" href="#uvm_vnp_setsize"><code class="Fn">uvm_vnp_setsize</code></a>() - sets the size of vnode <var class="Fa">vp</var> to - <var class="Fa">newsize</var>. Caller must hold a reference to the vnode. If - the vnode shrinks, pages no longer used are discarded.</p> -</section> -<section class="Sh"> -<h1 class="Sh" id="MISCELLANEOUS_MACROS"><a class="permalink" href="#MISCELLANEOUS_MACROS">MISCELLANEOUS - MACROS</a></h1> -<dl class="Bl-ohang"> - <dt><var class="Ft">paddr_t</var></dt> - <dd><code class="Fn">atop</code>(<var class="Fa">paddr_t pa</var>);</dd> - <dt><var class="Ft">paddr_t</var></dt> - <dd><code class="Fn">ptoa</code>(<var class="Fa">paddr_t pn</var>);</dd> - <dt><var class="Ft">paddr_t</var></dt> - <dd><code class="Fn">round_page</code>(<var class="Fa">address</var>);</dd> - <dt><var class="Ft">paddr_t</var></dt> - <dd><code class="Fn">trunc_page</code>(<var class="Fa">address</var>);</dd> -</dl> -<p class="Pp" id="atop">The - <a class="permalink" href="#atop"><code class="Fn">atop</code></a>() macro - converts a physical address <var class="Fa">pa</var> into a page number. The - <a class="permalink" href="#ptoa"><code class="Fn" id="ptoa">ptoa</code></a>() - macro does the opposite by converting a page number <var class="Fa">pn</var> - into a physical address.</p> -<p class="Pp" id="round_page"><a class="permalink" href="#round_page"><code class="Fn">round_page</code></a>() - and - <a class="permalink" href="#trunc_page"><code class="Fn" id="trunc_page">trunc_page</code></a>() - macros return a page address boundary from rounding - <var class="Fa">address</var> up and down, respectively, to the nearest page - boundary. These macros work for either addresses or byte counts.</p> -</section> -<section class="Sh"> -<h1 class="Sh" id="SYSCTL"><a class="permalink" href="#SYSCTL">SYSCTL</a></h1> -<p class="Pp">UVM provides support for the <code class="Dv">CTL_VM</code> domain - of the <a class="Xr">sysctl(3)</a> hierarchy. It handles the - <code class="Dv">VM_LOADAVG</code>, <code class="Dv">VM_METER</code>, - <code class="Dv">VM_UVMEXP</code>, and <code class="Dv">VM_UVMEXP2</code> - nodes, which return the current load averages, calculates current VM totals, - returns the uvmexp structure, and a kernel version independent view of the - uvmexp structure, respectively. It also exports a number of tunables that - control how much VM space is allowed to be consumed by various tasks. The - load averages are typically accessed from userland using the - <a class="Xr">getloadavg(3)</a> function. The uvmexp structure has all - global state of the UVM system, and has the following members:</p> -<div class="Bd Pp Li"> -<pre>/* vm_page constants */ -int pagesize; /* size of a page (PAGE_SIZE): must be power of 2 */ -int pagemask; /* page mask */ -int pageshift; /* page shift */ - -/* vm_page counters */ -int npages; /* number of pages we manage */ -int free; /* number of free pages */ -int paging; /* number of pages in the process of being paged out */ -int wired; /* number of wired pages */ -int reserve_pagedaemon; /* number of pages reserved for pagedaemon */ -int reserve_kernel; /* number of pages reserved for kernel */ - -/* pageout params */ -int freemin; /* min number of free pages */ -int freetarg; /* target number of free pages */ -int inactarg; /* target number of inactive pages */ -int wiredmax; /* max number of wired pages */ - -/* swap */ -int nswapdev; /* number of configured swap devices in system */ -int swpages; /* number of PAGE_SIZE'ed swap pages */ -int swpginuse; /* number of swap pages in use */ -int nswget; /* number of times fault calls uvm_swap_get() */ -int nanon; /* number total of anon's in system */ -int nfreeanon; /* number of free anon's */ - -/* stat counters */ -int faults; /* page fault count */ -int traps; /* trap count */ -int intrs; /* interrupt count */ -int swtch; /* context switch count */ -int softs; /* software interrupt count */ -int syscalls; /* system calls */ -int pageins; /* pagein operation count */ - /* pageouts are in pdpageouts below */ -int pgswapin; /* pages swapped in */ -int pgswapout; /* pages swapped out */ -int forks; /* forks */ -int forks_ppwait; /* forks where parent waits */ -int forks_sharevm; /* forks where vmspace is shared */ - -/* fault subcounters */ -int fltnoram; /* number of times fault was out of ram */ -int fltnoanon; /* number of times fault was out of anons */ -int fltpgwait; /* number of times fault had to wait on a page */ -int fltpgrele; /* number of times fault found a released page */ -int fltrelck; /* number of times fault relock called */ -int fltrelckok; /* number of times fault relock is a success */ -int fltanget; /* number of times fault gets anon page */ -int fltanretry; /* number of times fault retrys an anon get */ -int fltamcopy; /* number of times fault clears "needs copy" */ -int fltnamap; /* number of times fault maps a neighbor anon page */ -int fltnomap; /* number of times fault maps a neighbor obj page */ -int fltlget; /* number of times fault does a locked pgo_get */ -int fltget; /* number of times fault does an unlocked get */ -int flt_anon; /* number of times fault anon (case 1a) */ -int flt_acow; /* number of times fault anon cow (case 1b) */ -int flt_obj; /* number of times fault is on object page (2a) */ -int flt_prcopy; /* number of times fault promotes with copy (2b) */ -int flt_przero; /* number of times fault promotes with zerofill (2b) */ - -/* daemon counters */ -int pdwoke; /* number of times daemon woke up */ -int pdrevs; /* number of times daemon rev'd clock hand */ -int pdfreed; /* number of pages daemon freed since boot */ -int pdscans; /* number of pages daemon scanned since boot */ -int pdanscan; /* number of anonymous pages scanned by daemon */ -int pdobscan; /* number of object pages scanned by daemon */ -int pdreact; /* number of pages daemon reactivated since boot */ -int pdbusy; /* number of times daemon found a busy page */ -int pdpageouts; /* number of times daemon started a pageout */ -int pddeact; /* number of pages daemon deactivates */</pre> -</div> -</section> -<section class="Sh"> -<h1 class="Sh" id="NOTES"><a class="permalink" href="#NOTES">NOTES</a></h1> -<p class="Pp"><code class="Fn">uvm_chgkprot</code>() is only available if the - kernel has been compiled with options <code class="Dv">KGDB</code>.</p> -<p class="Pp">All structure and types whose names begin with “vm_” - will be renamed to “uvm_”.</p> -</section> -<section class="Sh"> -<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE - ALSO</a></h1> -<p class="Pp"><a class="Xr">swapctl(2)</a>, <a class="Xr">getloadavg(3)</a>, - <a class="Xr">kvm(3)</a>, <a class="Xr">sysctl(3)</a>, - <a class="Xr">ddb(4)</a>, <a class="Xr">options(4)</a>, - <a class="Xr">memoryallocators(9)</a>, <a class="Xr">pmap(9)</a>, - <a class="Xr">ubc(9)</a>, <a class="Xr">uvm_km(9)</a>, - <a class="Xr">uvm_map(9)</a></p> -<p class="Pp"><cite class="Rs"><span class="RsA">Charles D. Cranor</span> and - <span class="RsA">Gurudatta M. Parulkar</span>, <span class="RsT">The UVM - Virtual Memory System</span>, <i class="RsB">Proceedings of the USENIX - Annual Technical Conference</i>, <i class="RsI">USENIX Association</i>, - <a class="RsU" href="http://www.usenix.org/event/usenix99/full_papers/cranor/cranor.pdf">http://www.usenix.org/event/usenix99/full_papers/cranor/cranor.pdf</a>, - <span class="RsP">117-130</span>, <span class="RsD">June 6-11, - 1999</span>.</cite></p> -</section> -<section class="Sh"> -<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1> -<p class="Pp">UVM is a new VM system developed at Washington University in St. - Louis (Missouri). UVM's roots lie partly in the Mach-based - <span class="Ux">4.4BSD</span> VM system, the - <span class="Ux">FreeBSD</span> VM system, and the SunOS 4 VM system. UVM's - basic structure is based on the <span class="Ux">4.4BSD</span> VM system. - UVM's new anonymous memory system is based on the anonymous memory system - found in the SunOS 4 VM (as described in papers published by Sun - Microsystems, Inc.). UVM also includes a number of features new to - <span class="Ux">BSD</span> including page loanout, map entry passing, - simplified copy-on-write, and clustered anonymous memory pageout. UVM is - also further documented in an August 1998 dissertation by Charles D. - Cranor.</p> -<p class="Pp">UVM appeared in <span class="Ux">NetBSD 1.4</span>.</p> -</section> -<section class="Sh"> -<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1> -<p class="Pp"><span class="An">Charles D. Cranor</span> - <<a class="Mt" href="mailto:chuck@ccrc.wustl.edu">chuck@ccrc.wustl.edu</a>> - designed and implemented UVM.</p> -<p class="Pp"><span class="An">Matthew Green</span> - <<a class="Mt" href="mailto:mrg@eterna23.net">mrg@eterna23.net</a>> - wrote the swap-space management code and handled the logistical issues - involved with merging UVM into the <span class="Ux">NetBSD</span> source - tree.</p> -<p class="Pp"><span class="An">Chuck Silvers</span> - <<a class="Mt" href="mailto:chuq@chuq.com">chuq@chuq.com</a>> - implemented the aobj pager, thus allowing UVM to support System V shared - memory and process swapping.</p> -</section> -</div> -<table class="foot"> - <tr> - <td class="foot-date">March 23, 2015</td> - <td class="foot-os">NetBSD 10.1</td> - </tr> -</table> |
