1 2 3#include <linux/init.h> 4#include <linux/bootmem.h> 5#include <asm/tlb.h> 6 7DEFINE_PER_CPU(struct mmu_gather, mmu_gathers); 8 9unsigned long empty_zero_page; 10 11extern char _stext, _edata, _etext; /* From linkerscript */ 12extern char __init_begin, __init_end; 13 14void 15show_mem(void) 16{ 17 int i,free = 0,total = 0,cached = 0, reserved = 0, nonshared = 0; 18 int shared = 0; 19 20 printk("\nMem-info:\n"); 21 show_free_areas(); 22 printk("Free swap: %6ldkB\n", nr_swap_pages<<(PAGE_SHIFT-10)); 23 i = max_mapnr; 24 while (i-- > 0) { 25 total++; 26 if (PageReserved(mem_map+i)) 27 reserved++; 28 else if (PageSwapCache(mem_map+i)) 29 cached++; 30 else if (!page_count(mem_map+i)) 31 free++; 32 else if (page_count(mem_map+i) == 1) 33 nonshared++; 34 else 35 shared += page_count(mem_map+i) - 1; 36 } 37 printk("%d pages of RAM\n",total); 38 printk("%d free pages\n",free); 39 printk("%d reserved pages\n",reserved); 40 printk("%d pages nonshared\n",nonshared); 41 printk("%d pages shared\n",shared); 42 printk("%d pages swap cached\n",cached); 43} 44 45void __init 46mem_init(void) 47{ 48 int codesize, reservedpages, datasize, initsize; 49 unsigned long tmp; 50 51 if(!mem_map) 52 BUG(); 53 54 /* max/min_low_pfn was set by setup.c 55 * now we just copy it to some other necessary places... 56 * 57 * high_memory was also set in setup.c 58 */ 59 60 max_mapnr = num_physpages = max_low_pfn - min_low_pfn; 61 62 /* this will put all memory onto the freelists */ 63 totalram_pages = free_all_bootmem(); 64 65 reservedpages = 0; 66 for (tmp = 0; tmp < max_mapnr; tmp++) { 67 /* 68 * Only count reserved RAM pages 69 */ 70 if (PageReserved(mem_map + tmp)) 71 reservedpages++; 72 } 73 74 codesize = (unsigned long) &_etext - (unsigned long) &_stext; 75 datasize = (unsigned long) &_edata - (unsigned long) &_etext; 76 initsize = (unsigned long) &__init_end - (unsigned long) &__init_begin; 77 78 printk(KERN_INFO 79 "Memory: %luk/%luk available (%dk kernel code, %dk reserved, %dk data, " 80 "%dk init)\n" , 81 (unsigned long) nr_free_pages() << (PAGE_SHIFT-10), 82 max_mapnr << (PAGE_SHIFT-10), 83 codesize >> 10, 84 reservedpages << (PAGE_SHIFT-10), 85 datasize >> 10, 86 initsize >> 10 87 ); 88} 89 90/* free the pages occupied by initialization code */ 91 92void 93free_initmem(void) 94{ 95 unsigned long addr; 96 97 addr = (unsigned long)(&__init_begin); 98 for (; addr < (unsigned long)(&__init_end); addr += PAGE_SIZE) { 99 ClearPageReserved(virt_to_page(addr)); 100 init_page_count(virt_to_page(addr)); 101 free_page(addr); 102 totalram_pages++; 103 } 104 printk (KERN_INFO "Freeing unused kernel memory: %luk freed\n", 105 (unsigned long)((&__init_end - &__init_begin) >> 10)); 106} 107