[BACK]Return to uvm_init.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / sys / uvm

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>