Annotation of src/sys/uvm/uvm_init.c, Revision 1.55
1.55 ! chs 1: /* $NetBSD: uvm_init.c,v 1.54 2020/10/07 17:51:50 chs Exp $ */
1.1 mrg 2:
3: /*
4: * Copyright (c) 1997 Charles D. Cranor and Washington University.
5: * All rights reserved.
6: *
7: * Redistribution and use in source and binary forms, with or without
8: * modification, are permitted provided that the following conditions
9: * are met:
10: * 1. Redistributions of source code must retain the above copyright
11: * notice, this list of conditions and the following disclaimer.
12: * 2. Redistributions in binary form must reproduce the above copyright
13: * notice, this list of conditions and the following disclaimer in the
14: * documentation and/or other materials provided with the distribution.
15: *
16: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19: * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20: * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21: * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25: * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1.4 mrg 26: *
27: * from: Id: uvm_init.c,v 1.1.2.3 1998/02/06 05:15:27 chs Exp
1.1 mrg 28: */
29:
30: /*
31: * uvm_init.c: init the vm system.
32: */
1.15 lukem 33:
34: #include <sys/cdefs.h>
1.55 ! chs 35: __KERNEL_RCSID(0, "$NetBSD: uvm_init.c,v 1.54 2020/10/07 17:51:50 chs Exp $");
1.1 mrg 36:
37: #include <sys/param.h>
38: #include <sys/systm.h>
1.30 yamt 39: #include <sys/debug.h>
1.1 mrg 40: #include <sys/file.h>
41: #include <sys/filedesc.h>
42: #include <sys/resourcevar.h>
1.34 rmind 43: #include <sys/kmem.h>
1.1 mrg 44: #include <sys/mman.h>
45: #include <sys/vnode.h>
46:
47: #include <uvm/uvm.h>
1.26 yamt 48: #include <uvm/uvm_pdpolicy.h>
1.48 cherry 49: #include <uvm/uvm_physseg.h>
1.31 ad 50: #include <uvm/uvm_readahead.h>
1.1 mrg 51:
52: /*
1.28 ad 53: * struct uvm: we store most global vars in this structure to make them
1.1 mrg 54: * easier to spot...
55: */
56:
57: struct uvm uvm; /* decl */
58: struct uvmexp uvmexp; /* decl */
1.28 ad 59: struct uvm_object *uvm_kernel_object;
60:
1.38 uebayasi 61: #if defined(__uvmexp_pagesize)
1.44 matt 62: const int * const uvmexp_pagesize = &uvmexp.pagesize;
63: const int * const uvmexp_pagemask = &uvmexp.pagemask;
64: const int * const uvmexp_pageshift = &uvmexp.pageshift;
1.37 uebayasi 65: #endif
66:
1.50 ad 67: kmutex_t uvm_kentry_lock __cacheline_aligned;
1.1 mrg 68:
69: /*
1.47 cherry 70: * uvm_md_init: Init dependant on the MD boot context.
71: * called from MD code.
72: */
73:
74: void
75: uvm_md_init(void)
76: {
77: uvm_setpagesize(); /* initialize PAGE_SIZE-dependent variables */
1.48 cherry 78: uvm_physseg_init();
1.47 cherry 79: }
80:
81: /*
1.1 mrg 82: * uvm_init: init the VM system. called from kern/init_main.c.
83: */
84:
1.6 mrg 85: void
1.23 thorpej 86: uvm_init(void)
1.1 mrg 87: {
1.18 thorpej 88: vaddr_t kvm_start, kvm_end;
1.1 mrg 89:
1.6 mrg 90: /*
1.43 rmind 91: * Ensure that the hardware set the page size, zero the UVM structure.
1.6 mrg 92: */
1.1 mrg 93:
1.6 mrg 94: if (uvmexp.pagesize == 0) {
95: panic("uvm_init: page size not set");
96: }
1.1 mrg 97:
1.8 perry 98: memset(&uvm, 0, sizeof(uvm));
1.6 mrg 99: averunnable.fscale = FSCALE;
1.1 mrg 100:
1.6 mrg 101: /*
1.43 rmind 102: * Init the page sub-system. This includes allocating the vm_page
103: * structures, and setting up all the page queues (and locks).
104: * Available memory will be put in the "free" queue, kvm_start and
105: * kvm_end will be set to the area of kernel virtual memory which
106: * is available for general use.
1.6 mrg 107: */
1.1 mrg 108:
1.18 thorpej 109: uvm_page_init(&kvm_start, &kvm_end);
1.54 chs 110: uvm_pglistalloc_init();
1.1 mrg 111:
1.6 mrg 112: /*
1.43 rmind 113: * Init the map sub-system.
1.6 mrg 114: */
1.1 mrg 115:
1.6 mrg 116: uvm_map_init();
1.1 mrg 117:
1.6 mrg 118: /*
1.43 rmind 119: * Setup the kernel's virtual memory data structures. This includes
1.45 para 120: * setting up the kernel_map/kernel_object.
121: * Bootstrap all kernel memory allocators.
1.6 mrg 122: */
1.1 mrg 123:
1.42 para 124: uao_init();
125: uvm_km_bootstrap(kvm_start, kvm_end);
126:
1.43 rmind 127: /*
128: * Setup uvm_map caches and init the amap.
1.42 para 129: */
130:
131: uvm_map_init_caches();
132: uvm_amap_init();
1.1 mrg 133:
1.6 mrg 134: /*
1.43 rmind 135: * Init the pmap module. The pmap module is free to allocate
1.6 mrg 136: * memory for its private use (e.g. pvlists).
137: */
1.1 mrg 138:
1.6 mrg 139: pmap_init();
1.1 mrg 140:
1.43 rmind 141: /*
1.45 para 142: * Make kernel memory allocators ready for use.
143: * After this call the pool/kmem memory allocators can be used.
1.6 mrg 144: */
1.1 mrg 145:
1.42 para 146: uvm_km_init();
1.46 riastrad 147: #ifdef __HAVE_PMAP_PV_TRACK
148: pmap_pv_init();
149: #endif
1.1 mrg 150:
1.30 yamt 151: #ifdef DEBUG
152: debug_init();
153: #endif
154:
1.6 mrg 155: /*
1.43 rmind 156: * Init all pagers and the pager_map.
1.6 mrg 157: */
1.1 mrg 158:
1.6 mrg 159: uvm_pager_init();
1.1 mrg 160:
1.6 mrg 161: /*
1.41 rmind 162: * Initialize the uvm_loan() facility.
163: */
164:
165: uvm_loan_init();
166:
167: /*
1.53 ad 168: * Enable paging of kernel objects.
1.55 ! chs 169: * This second pass of initializing kernel_object requires rw_obj,
! 170: * so initialize that first.
1.6 mrg 171: */
1.3 chs 172:
1.55 ! chs 173: rw_obj_init();
1.18 thorpej 174: uao_create(VM_MAX_KERNEL_ADDRESS - VM_MIN_KERNEL_ADDRESS,
175: UAO_FLAG_KERNSWAP);
1.1 mrg 176:
1.26 yamt 177: uvmpdpol_reinit();
178:
1.6 mrg 179: /*
1.43 rmind 180: * Init anonymous memory systems.
1.22 yamt 181: */
182:
183: uvm_anon_init();
1.31 ad 184:
1.32 yamt 185: uvm_uarea_init();
186:
1.31 ad 187: /*
1.43 rmind 188: * Init readahead mechanism.
1.31 ad 189: */
190:
191: uvm_ra_init();
1.1 mrg 192: }
CVSweb <webmaster@jp.NetBSD.org>