root/uvm/uvm_init.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. uvm_init

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

/* [<][>][^][v][top][bottom][index][help] */