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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/arch/arm/mm/init.c
  3.  *
  4.  *  Copyright (C) 1995-2000 Russell King
  5.  *
  6.  * This program is free software; you can redistribute it and/or modify
  7.  * it under the terms of the GNU General Public License version 2 as
  8.  * published by the Free Software Foundation.
  9.  */
  10. #include <linux/config.h>
  11. #include <linux/signal.h>
  12. #include <linux/sched.h>
  13. #include <linux/kernel.h>
  14. #include <linux/errno.h>
  15. #include <linux/string.h>
  16. #include <linux/types.h>
  17. #include <linux/ptrace.h>
  18. #include <linux/mman.h>
  19. #include <linux/mm.h>
  20. #include <linux/swap.h>
  21. #include <linux/swapctl.h>
  22. #include <linux/smp.h>
  23. #include <linux/init.h>
  24. #include <linux/bootmem.h>
  25. #include <linux/blk.h>
  26. #include <asm/segment.h>
  27. #include <asm/mach-types.h>
  28. #include <asm/pgalloc.h>
  29. #include <asm/dma.h>
  30. #include <asm/hardware.h>
  31. #include <asm/setup.h>
  32. #include <asm/mach/arch.h>
  33. #include <asm/mach/map.h>
  34. #ifndef CONFIG_DISCONTIGMEM
  35. #define NR_NODES 1
  36. #else
  37. #define NR_NODES 4
  38. #endif
  39. #ifdef CONFIG_CPU_32
  40. #define TABLE_OFFSET (PTRS_PER_PTE)
  41. #else
  42. #define TABLE_OFFSET 0
  43. #endif
  44. #define TABLE_SIZE ((TABLE_OFFSET + PTRS_PER_PTE) * sizeof(void *))
  45. static unsigned long totalram_pages;
  46. extern pgd_t swapper_pg_dir[PTRS_PER_PGD];
  47. extern char _stext, _text, _etext, _end, __init_begin, __init_end;
  48. /*
  49.  * The sole use of this is to pass memory configuration
  50.  * data from paging_init to mem_init.
  51.  */
  52. static struct meminfo meminfo __initdata = { 0, };
  53. /*
  54.  * empty_zero_page is a special page that is used for
  55.  * zero-initialized data and COW.
  56.  */
  57. struct page *empty_zero_page;
  58. #ifndef CONFIG_NO_PGT_CACHE
  59. struct pgtable_cache_struct quicklists;
  60. int do_check_pgt_cache(int low, int high)
  61. {
  62. int freed = 0;
  63. if(pgtable_cache_size > high) {
  64. do {
  65. if(pgd_quicklist) {
  66. free_pgd_slow(get_pgd_fast());
  67. freed++;
  68. }
  69. if(pmd_quicklist) {
  70. pmd_free_slow(pmd_alloc_one_fast(NULL, 0));
  71. freed++;
  72. }
  73. if(pte_quicklist) {
  74. pte_free_slow(pte_alloc_one_fast(NULL, 0));
  75. freed++;
  76. }
  77. } while(pgtable_cache_size > low);
  78. }
  79. return freed;
  80. }
  81. #else
  82. int do_check_pgt_cache(int low, int high)
  83. {
  84. return 0;
  85. }
  86. #endif
  87. /* This is currently broken
  88.  * PG_skip is used on sparc/sparc64 architectures to "skip" certain
  89.  * parts of the address space.
  90.  *
  91.  * #define PG_skip 10
  92.  * #define PageSkip(page) (machine_is_riscpc() && test_bit(PG_skip, &(page)->flags))
  93.  * if (PageSkip(page)) {
  94.  * page = page->next_hash;
  95.  * if (page == NULL)
  96.  * break;
  97.  * }
  98.  */
  99. void show_mem(void)
  100. {
  101. int free = 0, total = 0, reserved = 0;
  102. int shared = 0, cached = 0, slab = 0, node;
  103. printk("Mem-info:n");
  104. show_free_areas();
  105. printk("Free swap:       %6dkBn",nr_swap_pages<<(PAGE_SHIFT-10));
  106. for (node = 0; node < numnodes; node++) {
  107. struct page *page, *end;
  108. page = NODE_MEM_MAP(node);
  109. end  = page + NODE_DATA(node)->node_size;
  110. do {
  111. total++;
  112. if (PageReserved(page))
  113. reserved++;
  114. else if (PageSwapCache(page))
  115. cached++;
  116. else if (PageSlab(page))
  117. slab++;
  118. else if (!page_count(page))
  119. free++;
  120. else
  121. shared += atomic_read(&page->count) - 1;
  122. page++;
  123. } while (page < end);
  124. }
  125. printk("%d pages of RAMn", total);
  126. printk("%d free pagesn", free);
  127. printk("%d reserved pagesn", reserved);
  128. printk("%d slab pagesn", slab);
  129. printk("%d pages sharedn", shared);
  130. printk("%d pages swap cachedn", cached);
  131. #ifndef CONFIG_NO_PGT_CACHE
  132. printk("%ld page tables cachedn", pgtable_cache_size);
  133. #endif
  134. show_buffers();
  135. }
  136. struct node_info {
  137. unsigned int start;
  138. unsigned int end;
  139. int bootmap_pages;
  140. };
  141. #define O_PFN_DOWN(x) ((x) >> PAGE_SHIFT)
  142. #define V_PFN_DOWN(x) O_PFN_DOWN(__pa(x))
  143. #define O_PFN_UP(x) (PAGE_ALIGN(x) >> PAGE_SHIFT)
  144. #define V_PFN_UP(x) O_PFN_UP(__pa(x))
  145. #define PFN_SIZE(x) ((x) >> PAGE_SHIFT)
  146. #define PFN_RANGE(s,e) PFN_SIZE(PAGE_ALIGN((unsigned long)(e)) - 
  147. (((unsigned long)(s)) & PAGE_MASK))
  148. /*
  149.  * FIXME: We really want to avoid allocating the bootmap bitmap
  150.  * over the top of the initrd.  Hopefully, this is located towards
  151.  * the start of a bank, so if we allocate the bootmap bitmap at
  152.  * the end, we won't clash.
  153.  */
  154. static unsigned int __init
  155. find_bootmap_pfn(int node, struct meminfo *mi, unsigned int bootmap_pages)
  156. {
  157. unsigned int start_pfn, bank, bootmap_pfn;
  158. start_pfn   = V_PFN_UP(&_end);
  159. bootmap_pfn = 0;
  160. for (bank = 0; bank < mi->nr_banks; bank ++) {
  161. unsigned int start, end;
  162. if (mi->bank[bank].node != node)
  163. continue;
  164. start = O_PFN_UP(mi->bank[bank].start);
  165. end   = O_PFN_DOWN(mi->bank[bank].size +
  166.    mi->bank[bank].start);
  167. if (end < start_pfn)
  168. continue;
  169. if (start < start_pfn)
  170. start = start_pfn;
  171. if (end <= start)
  172. continue;
  173. if (end - start >= bootmap_pages) {
  174. bootmap_pfn = start;
  175. break;
  176. }
  177. }
  178. if (bootmap_pfn == 0)
  179. BUG();
  180. return bootmap_pfn;
  181. }
  182. /*
  183.  * Scan the memory info structure and pull out:
  184.  *  - the end of memory
  185.  *  - the number of nodes
  186.  *  - the pfn range of each node
  187.  *  - the number of bootmem bitmap pages
  188.  */
  189. static unsigned int __init
  190. find_memend_and_nodes(struct meminfo *mi, struct node_info *np)
  191. {
  192. unsigned int i, bootmem_pages = 0, memend_pfn = 0;
  193. for (i = 0; i < NR_NODES; i++) {
  194. np[i].start = -1U;
  195. np[i].end = 0;
  196. np[i].bootmap_pages = 0;
  197. }
  198. for (i = 0; i < mi->nr_banks; i++) {
  199. unsigned long start, end;
  200. int node;
  201. if (mi->bank[i].size == 0) {
  202. /*
  203.  * Mark this bank with an invalid node number
  204.  */
  205. mi->bank[i].node = -1;
  206. continue;
  207. }
  208. node = mi->bank[i].node;
  209. if (node >= numnodes) {
  210. numnodes = node + 1;
  211. /*
  212.  * Make sure we haven't exceeded the maximum number
  213.  * of nodes that we have in this configuration.  If
  214.  * we have, we're in trouble.  (maybe we ought to
  215.  * limit, instead of bugging?)
  216.  */
  217. if (numnodes > NR_NODES)
  218. BUG();
  219. }
  220. /*
  221.  * Get the start and end pfns for this bank
  222.  */
  223. start = O_PFN_UP(mi->bank[i].start);
  224. end   = O_PFN_DOWN(mi->bank[i].start + mi->bank[i].size);
  225. if (np[node].start > start)
  226. np[node].start = start;
  227. if (np[node].end < end)
  228. np[node].end = end;
  229. if (memend_pfn < end)
  230. memend_pfn = end;
  231. }
  232. /*
  233.  * Calculate the number of pages we require to
  234.  * store the bootmem bitmaps.
  235.  */
  236. for (i = 0; i < numnodes; i++) {
  237. if (np[i].end == 0)
  238. continue;
  239. np[i].bootmap_pages = bootmem_bootmap_pages(np[i].end -
  240.     np[i].start);
  241. bootmem_pages += np[i].bootmap_pages;
  242. }
  243. /*
  244.  * This doesn't seem to be used by the Linux memory
  245.  * manager any more.  If we can get rid of it, we
  246.  * also get rid of some of the stuff above as well.
  247.  */
  248. max_low_pfn = memend_pfn - O_PFN_DOWN(PHYS_OFFSET);
  249. mi->end = memend_pfn << PAGE_SHIFT;
  250. return bootmem_pages;
  251. }
  252. static int __init check_initrd(struct meminfo *mi)
  253. {
  254. int initrd_node = -2;
  255. #ifdef CONFIG_BLK_DEV_INITRD
  256. /*
  257.  * Make sure that the initrd is within a valid area of
  258.  * memory.
  259.  */
  260. if (initrd_start) {
  261. unsigned long phys_initrd_start, phys_initrd_end;
  262. unsigned int i;
  263. phys_initrd_start = __pa(initrd_start);
  264. phys_initrd_end   = __pa(initrd_end);
  265. for (i = 0; i < mi->nr_banks; i++) {
  266. unsigned long bank_end;
  267. bank_end = mi->bank[i].start + mi->bank[i].size;
  268. if (mi->bank[i].start <= phys_initrd_start &&
  269.     phys_initrd_end <= bank_end)
  270. initrd_node = mi->bank[i].node;
  271. }
  272. }
  273. if (initrd_node == -1) {
  274. printk(KERN_ERR "initrd (0x%08lx - 0x%08lx) extends beyond "
  275.        "physical memory - disabling initrdn",
  276.        initrd_start, initrd_end);
  277. initrd_start = initrd_end = 0;
  278. }
  279. #endif
  280. return initrd_node;
  281. }
  282. /*
  283.  * Reserve the various regions of node 0
  284.  */
  285. static __init void reserve_node_zero(unsigned int bootmap_pfn, unsigned int bootmap_pages)
  286. {
  287. pg_data_t *pgdat = NODE_DATA(0);
  288. /*
  289.  * Register the kernel text and data with bootmem.
  290.  * Note that this can only be in node 0.
  291.  */
  292. reserve_bootmem_node(pgdat, __pa(&_stext), &_end - &_stext);
  293. #ifdef CONFIG_CPU_32
  294. /*
  295.  * Reserve the page tables.  These are already in use,
  296.  * and can only be in node 0.
  297.  */
  298. reserve_bootmem_node(pgdat, __pa(swapper_pg_dir),
  299.      PTRS_PER_PGD * sizeof(void *));
  300. #endif
  301. /*
  302.  * And don't forget to reserve the allocator bitmap,
  303.  * which will be freed later.
  304.  */
  305. reserve_bootmem_node(pgdat, bootmap_pfn << PAGE_SHIFT,
  306.      bootmap_pages << PAGE_SHIFT);
  307. /*
  308.  * Hmm... This should go elsewhere, but we really really
  309.  * need to stop things allocating the low memory; we need
  310.  * a better implementation of GFP_DMA which does not assume
  311.  * that DMA-able memory starts at zero.
  312.  */
  313. if (machine_is_integrator())
  314. reserve_bootmem_node(pgdat, 0, __pa(swapper_pg_dir));
  315. /*
  316.  * These should likewise go elsewhere.  They pre-reserve
  317.  * the screen memory region at the start of main system
  318.  * memory.
  319.  */
  320. if (machine_is_archimedes() || machine_is_a5k())
  321. reserve_bootmem_node(pgdat, 0x02000000, 0x00080000);
  322. if (machine_is_edb7211())
  323. reserve_bootmem_node(pgdat, 0xc0000000, 0x00020000);
  324. if (machine_is_p720t())
  325. reserve_bootmem_node(pgdat, PHYS_OFFSET, 0x00014000);
  326. #ifdef CONFIG_SA1111
  327. /*
  328.  * Because of the SA1111 DMA bug, we want to preserve
  329.  * our precious DMA-able memory...
  330.  */
  331. reserve_bootmem_node(pgdat, PHYS_OFFSET, __pa(swapper_pg_dir)-PHYS_OFFSET);
  332. #endif
  333. }
  334. /*
  335.  * Register all available RAM in this node with the bootmem allocator.
  336.  */
  337. static inline void free_bootmem_node_bank(int node, struct meminfo *mi)
  338. {
  339. pg_data_t *pgdat = NODE_DATA(node);
  340. int bank;
  341. for (bank = 0; bank < mi->nr_banks; bank++)
  342. if (mi->bank[bank].node == node)
  343. free_bootmem_node(pgdat, mi->bank[bank].start,
  344.   mi->bank[bank].size);
  345. }
  346. /*
  347.  * Initialise the bootmem allocator for all nodes.  This is called
  348.  * early during the architecture specific initialisation.
  349.  */
  350. void __init bootmem_init(struct meminfo *mi)
  351. {
  352. struct node_info node_info[NR_NODES], *np = node_info;
  353. unsigned int bootmap_pages, bootmap_pfn, map_pg;
  354. int node, initrd_node;
  355. bootmap_pages = find_memend_and_nodes(mi, np);
  356. bootmap_pfn   = find_bootmap_pfn(0, mi, bootmap_pages);
  357. initrd_node   = check_initrd(mi);
  358. map_pg = bootmap_pfn;
  359. /*
  360.  * Initialise the bootmem nodes.
  361.  *
  362.  * What we really want to do is:
  363.  *
  364.  *   unmap_all_regions_except_kernel();
  365.  *   for_each_node_in_reverse_order(node) {
  366.  *     map_node(node);
  367.  *     allocate_bootmem_map(node);
  368.  *     init_bootmem_node(node);
  369.  *     free_bootmem_node(node);
  370.  *   }
  371.  *
  372.  * but this is a 2.5-type change.  For now, we just set
  373.  * the nodes up in reverse order.
  374.  *
  375.  * (we could also do with rolling bootmem_init and paging_init
  376.  * into one generic "memory_init" type function).
  377.  */
  378. np += numnodes - 1;
  379. for (node = numnodes - 1; node >= 0; node--, np--) {
  380. /*
  381.  * If there are no pages in this node, ignore it.
  382.  * Note that node 0 must always have some pages.
  383.  */
  384. if (np->end == 0) {
  385. if (node == 0)
  386. BUG();
  387. continue;
  388. }
  389. /*
  390.  * Initialise the bootmem allocator.
  391.  */
  392. init_bootmem_node(NODE_DATA(node), map_pg, np->start, np->end);
  393. free_bootmem_node_bank(node, mi);
  394. map_pg += np->bootmap_pages;
  395. /*
  396.  * If this is node 0, we need to reserve some areas ASAP -
  397.  * we may use bootmem on node 0 to setup the other nodes.
  398.  */
  399. if (node == 0)
  400. reserve_node_zero(bootmap_pfn, bootmap_pages);
  401. }
  402. #ifdef CONFIG_BLK_DEV_INITRD
  403. if (initrd_node >= 0)
  404. reserve_bootmem_node(NODE_DATA(initrd_node), __pa(initrd_start),
  405.      initrd_end - initrd_start);
  406. #endif
  407. if (map_pg != bootmap_pfn + bootmap_pages)
  408. BUG();
  409. }
  410. /*
  411.  * paging_init() sets up the page tables, initialises the zone memory
  412.  * maps, and sets up the zero page, bad page and bad page tables.
  413.  */
  414. void __init paging_init(struct meminfo *mi, struct machine_desc *mdesc)
  415. {
  416. void *zero_page;
  417. int node;
  418. memcpy(&meminfo, mi, sizeof(meminfo));
  419. /*
  420.  * allocate the zero page.  Note that we count on this going ok.
  421.  */
  422. zero_page = alloc_bootmem_low_pages(PAGE_SIZE);
  423. /*
  424.  * initialise the page tables.
  425.  */
  426. memtable_init(mi);
  427. if (mdesc->map_io)
  428. mdesc->map_io();
  429. flush_tlb_all();
  430. /*
  431.  * initialise the zones within each node
  432.  */
  433. for (node = 0; node < numnodes; node++) {
  434. unsigned long zone_size[MAX_NR_ZONES];
  435. unsigned long zhole_size[MAX_NR_ZONES];
  436. struct bootmem_data *bdata;
  437. pg_data_t *pgdat;
  438. int i;
  439. /*
  440.  * Initialise the zone size information.
  441.  */
  442. for (i = 0; i < MAX_NR_ZONES; i++) {
  443. zone_size[i]  = 0;
  444. zhole_size[i] = 0;
  445. }
  446. pgdat = NODE_DATA(node);
  447. bdata = pgdat->bdata;
  448. /*
  449.  * The size of this node has already been determined.
  450.  * If we need to do anything fancy with the allocation
  451.  * of this memory to the zones, now is the time to do
  452.  * it.
  453.  */
  454. zone_size[0] = bdata->node_low_pfn -
  455. (bdata->node_boot_start >> PAGE_SHIFT);
  456. /*
  457.  * If this zone has zero size, skip it.
  458.  */
  459. if (!zone_size[0])
  460. continue;
  461. /*
  462.  * For each bank in this node, calculate the size of the
  463.  * holes.  holes = node_size - sum(bank_sizes_in_node)
  464.  */
  465. zhole_size[0] = zone_size[0];
  466. for (i = 0; i < mi->nr_banks; i++) {
  467. if (mi->bank[i].node != node)
  468. continue;
  469. zhole_size[0] -= mi->bank[i].size >> PAGE_SHIFT;
  470. }
  471. /*
  472.  * Adjust the sizes according to any special
  473.  * requirements for this machine type.
  474.  */
  475. arch_adjust_zones(node, zone_size, zhole_size);
  476. free_area_init_node(node, pgdat, 0, zone_size,
  477. bdata->node_boot_start, zhole_size);
  478. }
  479. /*
  480.  * finish off the bad pages once
  481.  * the mem_map is initialised
  482.  */
  483. memzero(zero_page, PAGE_SIZE);
  484. empty_zero_page = virt_to_page(zero_page);
  485. flush_dcache_page(empty_zero_page);
  486. }
  487. static inline void free_area(unsigned long addr, unsigned long end, char *s)
  488. {
  489. unsigned int size = (end - addr) >> 10;
  490. for (; addr < end; addr += PAGE_SIZE) {
  491. struct page *page = virt_to_page(addr);
  492. ClearPageReserved(page);
  493. set_page_count(page, 1);
  494. free_page(addr);
  495. totalram_pages++;
  496. }
  497. if (size && s)
  498. printk("Freeing %s memory: %dKn", s, size);
  499. }
  500. /*
  501.  * mem_init() marks the free areas in the mem_map and tells us how much
  502.  * memory is free.  This is done after various parts of the system have
  503.  * claimed their memory after the kernel image.
  504.  */
  505. void __init mem_init(void)
  506. {
  507. unsigned int codepages, datapages, initpages;
  508. int i, node;
  509. codepages = &_etext - &_text;
  510. datapages = &_end - &_etext;
  511. initpages = &__init_end - &__init_begin;
  512. high_memory = (void *)__va(meminfo.end);
  513. max_mapnr   = virt_to_page(high_memory) - mem_map;
  514. /*
  515.  * We may have non-contiguous memory.
  516.  */
  517. if (meminfo.nr_banks != 1)
  518. create_memmap_holes(&meminfo);
  519. /* this will put all unused low memory onto the freelists */
  520. for (node = 0; node < numnodes; node++) {
  521. pg_data_t *pgdat = NODE_DATA(node);
  522. if (pgdat->node_size != 0)
  523. totalram_pages += free_all_bootmem_node(pgdat);
  524. }
  525. #ifdef CONFIG_SA1111
  526. /* now that our DMA memory is actually so designated, we can free it */
  527. free_area(PAGE_OFFSET, (unsigned long)swapper_pg_dir, NULL);
  528. #endif
  529. /*
  530.  * Since our memory may not be contiguous, calculate the
  531.  * real number of pages we have in this system
  532.  */
  533. printk(KERN_INFO "Memory:");
  534. num_physpages = 0;
  535. for (i = 0; i < meminfo.nr_banks; i++) {
  536. num_physpages += meminfo.bank[i].size >> PAGE_SHIFT;
  537. printk(" %ldMB", meminfo.bank[i].size >> 20);
  538. }
  539. printk(" = %luMB totaln", num_physpages >> (20 - PAGE_SHIFT));
  540. printk(KERN_NOTICE "Memory: %luKB available (%dK code, "
  541. "%dK data, %dK init)n",
  542. (unsigned long) nr_free_pages() << (PAGE_SHIFT-10),
  543. codepages >> 10, datapages >> 10, initpages >> 10);
  544. if (PAGE_SIZE >= 16384 && num_physpages <= 128) {
  545. extern int sysctl_overcommit_memory;
  546. /*
  547.  * On a machine this small we won't get
  548.  * anywhere without overcommit, so turn
  549.  * it on by default.
  550.  */
  551. sysctl_overcommit_memory = 1;
  552. }
  553. }
  554. void free_initmem(void)
  555. {
  556. if (!machine_is_integrator()) {
  557. free_area((unsigned long)(&__init_begin),
  558.   (unsigned long)(&__init_end),
  559.   "init");
  560. }
  561. }
  562. #ifdef CONFIG_BLK_DEV_INITRD
  563. static int keep_initrd;
  564. void free_initrd_mem(unsigned long start, unsigned long end)
  565. {
  566. if (!keep_initrd)
  567. free_area(start, end, "initrd");
  568. }
  569. static int __init keepinitrd_setup(char *__unused)
  570. {
  571. keep_initrd = 1;
  572. return 1;
  573. }
  574. __setup("keepinitrd", keepinitrd_setup);
  575. #endif
  576. void si_meminfo(struct sysinfo *val)
  577. {
  578. val->totalram  = totalram_pages;
  579. val->sharedram = 0;
  580. val->freeram   = nr_free_pages();
  581. val->bufferram = atomic_read(&buffermem_pages);
  582. val->totalhigh = 0;
  583. val->freehigh  = 0;
  584. val->mem_unit  = PAGE_SIZE;
  585. }