Annotation of src/sys/uvm/uvm_init.c, Revision 1.12
1.12 ! simonb 1: /* $NetBSD: uvm_init.c,v 1.11 1999/03/25 18:48:51 mrg Exp $ */
1.1 mrg 2:
3: /*
4: *
5: * Copyright (c) 1997 Charles D. Cranor and Washington University.
6: * All rights reserved.
7: *
8: * Redistribution and use in source and binary forms, with or without
9: * modification, are permitted provided that the following conditions
10: * are met:
11: * 1. Redistributions of source code must retain the above copyright
12: * notice, this list of conditions and the following disclaimer.
13: * 2. Redistributions in binary form must reproduce the above copyright
14: * notice, this list of conditions and the following disclaimer in the
15: * documentation and/or other materials provided with the distribution.
16: * 3. All advertising materials mentioning features or use of this software
17: * must display the following acknowledgement:
18: * This product includes software developed by Charles D. Cranor and
19: * Washington University.
20: * 4. The name of the author may not be used to endorse or promote products
21: * derived from this software without specific prior written permission.
22: *
23: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
24: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
25: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26: * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
27: * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
28: * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
32: * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1.4 mrg 33: *
34: * from: Id: uvm_init.c,v 1.1.2.3 1998/02/06 05:15:27 chs Exp
1.1 mrg 35: */
36:
37: /*
38: * uvm_init.c: init the vm system.
39: */
40:
41: #include <sys/param.h>
42: #include <sys/systm.h>
43: #include <sys/file.h>
44: #include <sys/filedesc.h>
45: #include <sys/resourcevar.h>
46: #include <sys/mman.h>
47: #include <sys/proc.h>
48: #include <sys/malloc.h>
49: #include <sys/vnode.h>
50:
51:
52: #include <vm/vm.h>
53: #include <vm/vm_page.h>
54: #include <vm/vm_kern.h>
55:
56: #include <uvm/uvm.h>
57:
58: /*
59: * struct uvm: we store all global vars in this structure to make them
60: * easier to spot...
61: */
62:
63: struct uvm uvm; /* decl */
64: struct uvmexp uvmexp; /* decl */
65:
66: /*
67: * local prototypes
68: */
69:
70: /*
71: * uvm_init: init the VM system. called from kern/init_main.c.
72: */
73:
1.6 mrg 74: void
75: uvm_init()
1.1 mrg 76: {
1.9 eeh 77: vaddr_t kvm_start, kvm_end;
1.1 mrg 78:
1.6 mrg 79: /*
80: * step 0: ensure that the hardware set the page size
81: */
1.1 mrg 82:
1.6 mrg 83: if (uvmexp.pagesize == 0) {
84: panic("uvm_init: page size not set");
85: }
1.1 mrg 86:
1.6 mrg 87: /*
88: * step 1: zero the uvm structure
89: */
1.1 mrg 90:
1.8 perry 91: memset(&uvm, 0, sizeof(uvm));
1.6 mrg 92: averunnable.fscale = FSCALE;
1.1 mrg 93:
1.6 mrg 94: /*
95: * step 2: init the page sub-system. this includes allocating the
96: * vm_page structures, and setting up all the page queues (and
97: * locks). available memory will be put in the "free" queue.
98: * kvm_start and kvm_end will be set to the area of kernel virtual
99: * memory which is available for general use.
100: */
1.1 mrg 101:
1.6 mrg 102: uvm_page_init(&kvm_start, &kvm_end);
1.1 mrg 103:
1.6 mrg 104: /*
105: * step 3: init the map sub-system. allocates the static pool of
106: * vm_map_entry structures that are used for "special" kernel maps
107: * (e.g. kernel_map, kmem_map, etc...).
108: */
1.1 mrg 109:
1.6 mrg 110: uvm_map_init();
1.1 mrg 111:
1.6 mrg 112: /*
113: * step 4: setup the kernel's virtual memory data structures. this
114: * includes setting up the kernel_map/kernel_object and the kmem_map/
115: * kmem_object.
116: */
1.1 mrg 117:
1.6 mrg 118: uvm_km_init(kvm_start, kvm_end);
1.1 mrg 119:
1.6 mrg 120: /*
121: * step 5: init the pmap module. the pmap module is free to allocate
122: * memory for its private use (e.g. pvlists).
123: */
1.1 mrg 124:
1.6 mrg 125: pmap_init();
1.1 mrg 126:
1.6 mrg 127: /*
128: * step 6: init the kernel memory allocator. after this call the
129: * kernel memory allocator (malloc) can be used.
130: */
1.1 mrg 131:
1.6 mrg 132: kmeminit();
1.1 mrg 133:
1.6 mrg 134: /*
135: * step 7: init all pagers and the pager_map.
136: */
1.1 mrg 137:
1.6 mrg 138: uvm_pager_init();
1.1 mrg 139:
1.6 mrg 140: /*
1.10 chuck 141: * step 8: init anonymous memory systems (both amap and anons)
1.6 mrg 142: */
1.1 mrg 143:
1.10 chuck 144: amap_init(); /* init amap module */
145: uvm_anon_init(); /* allocate initial anons */
1.1 mrg 146:
1.6 mrg 147: /*
148: * the VM system is now up! now that malloc is up we can resize the
149: * <obj,off> => <page> hash table for general use and enable paging
150: * of kernel objects.
151: */
1.3 chs 152:
1.6 mrg 153: uvm_page_rehash();
154: uao_create(VM_MAX_KERNEL_ADDRESS - VM_MIN_KERNEL_ADDRESS,
155: UAO_FLAG_KERNSWAP);
1.1 mrg 156:
1.6 mrg 157: /*
158: * done!
159: */
1.1 mrg 160:
1.6 mrg 161: return;
1.1 mrg 162: }
CVSweb <webmaster@jp.NetBSD.org>