init.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:5k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/arch/m68k/mm/init.c
  3.  *
  4.  *  Copyright (C) 1995  Hamish Macdonald
  5.  *
  6.  *  Contains common initialization routines, specific init code moved
  7.  *  to motorola.c and sun3mmu.c
  8.  */
  9. #include <linux/config.h>
  10. #include <linux/signal.h>
  11. #include <linux/sched.h>
  12. #include <linux/mm.h>
  13. #include <linux/swap.h>
  14. #include <linux/kernel.h>
  15. #include <linux/string.h>
  16. #include <linux/types.h>
  17. #include <linux/init.h>
  18. #include <linux/bootmem.h>
  19. #ifdef CONFIG_BLK_DEV_RAM
  20. #include <linux/blk.h>
  21. #endif
  22. #include <asm/setup.h>
  23. #include <asm/uaccess.h>
  24. #include <asm/page.h>
  25. #include <asm/pgalloc.h>
  26. #include <asm/system.h>
  27. #include <asm/machdep.h>
  28. #include <asm/io.h>
  29. #ifdef CONFIG_ATARI
  30. #include <asm/atari_stram.h>
  31. #endif
  32. #include <asm/tlb.h>
  33. mmu_gather_t mmu_gathers[NR_CPUS];
  34. unsigned long totalram_pages = 0;
  35. int do_check_pgt_cache(int low, int high)
  36. {
  37. int freed = 0;
  38. if(pgtable_cache_size > high) {
  39. do {
  40. if(pmd_quicklist)
  41. freed += free_pmd_slow(get_pmd_fast());
  42. if(pte_quicklist)
  43. free_pte_slow(get_pte_fast()), freed++;
  44. } while(pgtable_cache_size > low);
  45. }
  46. return freed;
  47. }
  48. /*
  49.  * BAD_PAGE is the page that is used for page faults when linux
  50.  * is out-of-memory. Older versions of linux just did a
  51.  * do_exit(), but using this instead means there is less risk
  52.  * for a process dying in kernel mode, possibly leaving an inode
  53.  * unused etc..
  54.  *
  55.  * BAD_PAGETABLE is the accompanying page-table: it is initialized
  56.  * to point to BAD_PAGE entries.
  57.  *
  58.  * ZERO_PAGE is a special page that is used for zero-initialized
  59.  * data and COW.
  60.  */
  61. unsigned long empty_bad_page_table;
  62. pte_t *__bad_pagetable(void)
  63. {
  64.     memset((void *)empty_bad_page_table, 0, PAGE_SIZE);
  65.     return (pte_t *)empty_bad_page_table;
  66. }
  67. unsigned long empty_bad_page;
  68. pte_t __bad_page(void)
  69. {
  70.     memset ((void *)empty_bad_page, 0, PAGE_SIZE);
  71.     return pte_mkdirty(__mk_pte(empty_bad_page, PAGE_SHARED));
  72. }
  73. unsigned long empty_zero_page;
  74. void show_mem(void)
  75. {
  76.     unsigned long i;
  77.     int free = 0, total = 0, reserved = 0, shared = 0;
  78.     int cached = 0;
  79.     printk("nMem-info:n");
  80.     show_free_areas();
  81.     printk("Free swap:       %6dkBn",nr_swap_pages<<(PAGE_SHIFT-10));
  82.     i = max_mapnr;
  83.     while (i-- > 0) {
  84. total++;
  85. if (PageReserved(mem_map+i))
  86.     reserved++;
  87. else if (PageSwapCache(mem_map+i))
  88.     cached++;
  89. else if (!page_count(mem_map+i))
  90.     free++;
  91. else
  92.     shared += page_count(mem_map+i) - 1;
  93.     }
  94.     printk("%d pages of RAMn",total);
  95.     printk("%d free pagesn",free);
  96.     printk("%d reserved pagesn",reserved);
  97.     printk("%d pages sharedn",shared);
  98.     printk("%d pages swap cachedn",cached);
  99.     printk("%ld pages in page table cachen",pgtable_cache_size);
  100.     show_buffers();
  101. }
  102. extern void init_pointer_table(unsigned long ptable);
  103. /* References to section boundaries */
  104. extern char _text, _etext, _edata, __bss_start, _end;
  105. extern char __init_begin, __init_end;
  106. extern pmd_t *zero_pgtable;
  107. void __init mem_init(void)
  108. {
  109. int codepages = 0;
  110. int datapages = 0;
  111. int initpages = 0;
  112. unsigned long tmp;
  113. int i;
  114. max_mapnr = num_physpages = MAP_NR(high_memory);
  115. #ifdef CONFIG_ATARI
  116. if (MACH_IS_ATARI)
  117. atari_stram_mem_init_hook();
  118. #endif
  119. /* this will put all memory onto the freelists */
  120. totalram_pages = free_all_bootmem();
  121. for (tmp = PAGE_OFFSET ; tmp < (unsigned long)high_memory; tmp += PAGE_SIZE) {
  122. #if 0
  123. #ifndef CONFIG_SUN3
  124. if (virt_to_phys ((void *)tmp) >= mach_max_dma_address)
  125. clear_bit(PG_DMA, &virt_to_page(tmp)->flags);
  126. #endif
  127. #endif
  128. if (PageReserved(virt_to_page(tmp))) {
  129. if (tmp >= (unsigned long)&_text
  130.     && tmp < (unsigned long)&_etext)
  131. codepages++;
  132. else if (tmp >= (unsigned long) &__init_begin
  133.  && tmp < (unsigned long) &__init_end)
  134. initpages++;
  135. else
  136. datapages++;
  137. continue;
  138. }
  139. #if 0
  140. set_page_count(virt_to_page(tmp), 1);
  141. #ifdef CONFIG_BLK_DEV_INITRD
  142. if (!initrd_start ||
  143.     (tmp < (initrd_start & PAGE_MASK) || tmp >= initrd_end))
  144. #endif
  145. free_page(tmp);
  146. #endif
  147. }
  148. #ifndef CONFIG_SUN3
  149. /* insert pointer tables allocated so far into the tablelist */
  150. init_pointer_table((unsigned long)kernel_pg_dir);
  151. for (i = 0; i < PTRS_PER_PGD; i++) {
  152. if (pgd_present(kernel_pg_dir[i]))
  153. init_pointer_table(__pgd_page(kernel_pg_dir[i]));
  154. }
  155. /* insert also pointer table that we used to unmap the zero page */
  156. if (zero_pgtable)
  157. init_pointer_table((unsigned long)zero_pgtable);
  158. #endif
  159. printk("Memory: %luk/%luk available (%dk kernel code, %dk data, %dk init)n",
  160.        (unsigned long)nr_free_pages() << (PAGE_SHIFT-10),
  161.        max_mapnr << (PAGE_SHIFT-10),
  162.        codepages << (PAGE_SHIFT-10),
  163.        datapages << (PAGE_SHIFT-10),
  164.        initpages << (PAGE_SHIFT-10));
  165. }
  166. #ifdef CONFIG_BLK_DEV_INITRD
  167. void free_initrd_mem(unsigned long start, unsigned long end)
  168. {
  169. int pages = 0;
  170. for (; start < end; start += PAGE_SIZE) {
  171. ClearPageReserved(virt_to_page(start));
  172. set_page_count(virt_to_page(start), 1);
  173. free_page(start);
  174. totalram_pages++;
  175. pages++;
  176. }
  177. printk ("Freeing initrd memory: %dk freedn", pages);
  178. }
  179. #endif
  180. void si_meminfo(struct sysinfo *val)
  181. {
  182.     unsigned long i;
  183.     i = max_mapnr;
  184.     val->totalram = totalram_pages;
  185.     val->sharedram = 0;
  186.     val->freeram = nr_free_pages();
  187.     val->bufferram = atomic_read(&buffermem_pages);
  188.     val->totalhigh = 0;
  189.     val->freehigh = 0;
  190.     val->mem_unit = PAGE_SIZE;
  191.     return;
  192. }