home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / bsd_srcs / sys / i386 / include / vmparam.h < prev    next >
Encoding:
C/C++ Source or Header  |  1991-05-12  |  8.3 KB  |  257 lines

  1. /*-
  2.  * Copyright (c) 1990 The Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * This code is derived from software contributed to Berkeley by
  6.  * William Jolitz.
  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 the University of
  19.  *    California, Berkeley and its contributors.
  20.  * 4. Neither the name of the University nor the names of its contributors
  21.  *    may be used to endorse or promote products derived from this software
  22.  *    without specific prior written permission.
  23.  *
  24.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  25.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  26.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  27.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  28.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  29.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  30.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  31.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  32.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  33.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  34.  * SUCH DAMAGE.
  35.  *
  36.  *    @(#)vmparam.h    5.9 (Berkeley) 5/12/91
  37.  */
  38.  
  39.  
  40. /*
  41.  * Machine dependent constants for 386.
  42.  */
  43.  
  44. /*
  45.  * Virtual address space arrangement. On 386, both user and kernel
  46.  * share the address space, not unlike the vax.
  47.  * USRTEXT is the start of the user text/data space, while USRSTACK
  48.  * is the top (end) of the user stack. Immediately above the user stack
  49.  * resides the user structure, which is UPAGES long and contains the
  50.  * kernel stack.
  51.  *
  52.  * Immediately after the user structure is the page table map, and then
  53.  * kernal address space.
  54.  */
  55. #define    USRTEXT        0
  56. #define    USRSTACK    0xFDBFE000
  57. #define    BTOPUSRSTACK    (0xFDC00-(UPAGES))    /* btop(USRSTACK) */
  58. #define    LOWPAGES    0
  59. #define HIGHPAGES    UPAGES
  60.  
  61. /*
  62.  * Virtual memory related constants, all in bytes
  63.  */
  64. #define    MAXTSIZ        (6*1024*1024)        /* max text size */
  65. #ifndef DFLDSIZ
  66. #define    DFLDSIZ        (6*1024*1024)        /* initial data size limit */
  67. #endif
  68. #ifndef MAXDSIZ
  69. #define    MAXDSIZ        (32*1024*1024)        /* max data size */
  70. #endif
  71. #ifndef    DFLSSIZ
  72. #define    DFLSSIZ        (512*1024)        /* initial stack size limit */
  73. #endif
  74. #ifndef    MAXSSIZ
  75. #define    MAXSSIZ        MAXDSIZ            /* max stack size */
  76. #endif
  77.  
  78. /*
  79.  * Default sizes of swap allocation chunks (see dmap.h).
  80.  * The actual values may be changed in vminit() based on MAXDSIZ.
  81.  * With MAXDSIZ of 16Mb and NDMAP of 38, dmmax will be 1024.
  82.  */
  83. #define    DMMIN    32            /* smallest swap allocation */
  84. #define    DMMAX    4096            /* largest potential swap allocation */
  85. #define    DMTEXT    1024            /* swap allocation for text */
  86.  
  87. /*
  88.  * Sizes of the system and user portions of the system page table.
  89.  */
  90. #define    SYSPTSIZE     (2*NPTEPG)
  91. #define    USRPTSIZE     (2*NPTEPG)
  92.  
  93. /*
  94.  * Size of User Raw I/O map
  95.  */
  96. #define    USRIOSIZE     300
  97.  
  98. /*
  99.  * The size of the clock loop.
  100.  */
  101. #define    LOOPPAGES    (maxfree - firstfree)
  102.  
  103. /*
  104.  * The time for a process to be blocked before being very swappable.
  105.  * This is a number of seconds which the system takes as being a non-trivial
  106.  * amount of real time.  You probably shouldn't change this;
  107.  * it is used in subtle ways (fractions and multiples of it are, that is, like
  108.  * half of a ``long time'', almost a long time, etc.)
  109.  * It is related to human patience and other factors which don't really
  110.  * change over time.
  111.  */
  112. #define    MAXSLP         20
  113.  
  114. /*
  115.  * A swapped in process is given a small amount of core without being bothered
  116.  * by the page replacement algorithm.  Basically this says that if you are
  117.  * swapped in you deserve some resources.  We protect the last SAFERSS
  118.  * pages against paging and will just swap you out rather than paging you.
  119.  * Note that each process has at least UPAGES+CLSIZE pages which are not
  120.  * paged anyways (this is currently 8+2=10 pages or 5k bytes), so this
  121.  * number just means a swapped in process is given around 25k bytes.
  122.  * Just for fun: current memory prices are 4600$ a megabyte on VAX (4/22/81),
  123.  * so we loan each swapped in process memory worth 100$, or just admit
  124.  * that we don't consider it worthwhile and swap it out to disk which costs
  125.  * $30/mb or about $0.75.
  126.  * { wfj 6/16/89: Retail AT memory expansion $800/megabyte, loan of $17
  127.  *   on disk costing $7/mb or $0.18 (in memory still 100:1 in cost!) }
  128.  */
  129. #define    SAFERSS        8        /* nominal ``small'' resident set size
  130.                        protected against replacement */
  131.  
  132. /*
  133.  * DISKRPM is used to estimate the number of paging i/o operations
  134.  * which one can expect from a single disk controller.
  135.  */
  136. #define    DISKRPM        60
  137.  
  138. /*
  139.  * Klustering constants.  Klustering is the gathering
  140.  * of pages together for pagein/pageout, while clustering
  141.  * is the treatment of hardware page size as though it were
  142.  * larger than it really is.
  143.  *
  144.  * KLMAX gives maximum cluster size in CLSIZE page (cluster-page)
  145.  * units.  Note that KLMAX*CLSIZE must be <= DMMIN in dmap.h.
  146.  */
  147.  
  148. #define    KLMAX    (4/CLSIZE)
  149. #define    KLSEQL    (2/CLSIZE)        /* in klust if vadvise(VA_SEQL) */
  150. #define    KLIN    (4/CLSIZE)        /* default data/stack in klust */
  151. #define    KLTXT    (4/CLSIZE)        /* default text in klust */
  152. #define    KLOUT    (4/CLSIZE)
  153.  
  154. /*
  155.  * KLSDIST is the advance or retard of the fifo reclaim for sequential
  156.  * processes data space.
  157.  */
  158. #define    KLSDIST    3        /* klusters advance/retard for seq. fifo */
  159.  
  160. /*
  161.  * Paging thresholds (see vm_sched.c).
  162.  * Strategy of 1/19/85:
  163.  *    lotsfree is 512k bytes, but at most 1/4 of memory
  164.  *    desfree is 200k bytes, but at most 1/8 of memory
  165.  *    minfree is 64k bytes, but at most 1/2 of desfree
  166.  */
  167. #define    LOTSFREE    (512 * 1024)
  168. #define    LOTSFREEFRACT    4
  169. #define    DESFREE        (200 * 1024)
  170. #define    DESFREEFRACT    8
  171. #define    MINFREE        (64 * 1024)
  172. #define    MINFREEFRACT    2
  173.  
  174. /*
  175.  * There are two clock hands, initially separated by HANDSPREAD bytes
  176.  * (but at most all of user memory).  The amount of time to reclaim
  177.  * a page once the pageout process examines it increases with this
  178.  * distance and decreases as the scan rate rises.
  179.  */
  180. #define    HANDSPREAD    (2 * 1024 * 1024)
  181.  
  182. /*
  183.  * The number of times per second to recompute the desired paging rate
  184.  * and poke the pagedaemon.
  185.  */
  186. #define    RATETOSCHEDPAGING    4
  187.  
  188. /*
  189.  * Believed threshold (in megabytes) for which interleaved
  190.  * swapping area is desirable.
  191.  */
  192. #define    LOTSOFMEM    2
  193.  
  194. #define    mapin(pte, v, pfnum, prot) \
  195.     {(*(int *)(pte) = ((pfnum)<<PGSHIFT) | (prot)) ; }
  196.  
  197. /*
  198.  * Mach derived constants
  199.  */
  200.  
  201. /* user/kernel map constants */
  202. #define VM_MIN_ADDRESS        ((vm_offset_t)0)
  203. #define VM_MAXUSER_ADDRESS    ((vm_offset_t)0xFDBFD000)
  204. #define UPT_MIN_ADDRESS        ((vm_offset_t)0xFDC00000)
  205. #define UPT_MAX_ADDRESS        ((vm_offset_t)0xFDFF7000)
  206. #define VM_MAX_ADDRESS        UPT_MAX_ADDRESS
  207. #define VM_MIN_KERNEL_ADDRESS    ((vm_offset_t)0xFDFF7000)
  208. #define UPDT            VM_MIN_KERNEL_ADDRESS
  209. #define KPT_MIN_ADDRESS        ((vm_offset_t)0xFDFF8000)
  210. #define KPT_MAX_ADDRESS        ((vm_offset_t)0xFDFFF000)
  211. #define VM_MAX_KERNEL_ADDRESS    ((vm_offset_t)0xFF7FF000)
  212.  
  213. /* virtual sizes (bytes) for various kernel submaps */
  214. #define VM_MBUF_SIZE        (NMBCLUSTERS*MCLBYTES)
  215. #define VM_KMEM_SIZE        (NKMEMCLUSTERS*CLBYTES)
  216. #define VM_PHYS_SIZE        (USRIOSIZE*CLBYTES)
  217.  
  218. /* # of kernel PT pages (initial only, can grow dynamically) */
  219. #define VM_KERNEL_PT_PAGES    ((vm_size_t)2)        /* XXX: SYSPTSIZE */
  220.  
  221. /* pcb base */
  222. #define    pcbb(p)        ((u_int)(p)->p_addr)
  223.  
  224. /*
  225.  * Flush MMU TLB
  226.  */
  227.  
  228. #ifndef I386_CR3PAT
  229. #define    I386_CR3PAT    0x0
  230. #endif
  231.  
  232. #ifdef notyet
  233. #define _cr3() ({u_long rtn; \
  234.     asm (" movl %%cr3,%%eax; movl %%eax,%0 " \
  235.         : "=g" (rtn) \
  236.         : \
  237.         : "ax"); \
  238.     rtn; \
  239. })
  240.  
  241. #define load_cr3(s) ({ u_long val; \
  242.     val = (s) | I386_CR3PAT; \
  243.     asm ("movl %0,%%eax; movl %%eax,%%cr3" \
  244.         :  \
  245.         : "g" (val) \
  246.         : "ax"); \
  247. })
  248.  
  249. #define tlbflush() ({ u_long val; \
  250.     val = u.u_pcb.pcb_ptd | I386_CR3PAT; \
  251.     asm ("movl %0,%%eax; movl %%eax,%%cr3" \
  252.         :  \
  253.         : "g" (val) \
  254.         : "ax"); \
  255. })
  256. #endif
  257.