linux啟動過程中 totalram_pages 的計算過程
阿新 • • 發佈:2018-11-28
1 釋放bootmem
start_kernel -- mem_init -- free_all_bootmem
/** * free_all_bootmem - release free pages to the buddy allocator * * Returns the number of pages actually released. */ unsigned long __init free_all_bootmem(void) { unsigned long pages; reset_all_zones_managed_pages(); pages = free_low_memory_core_early(); // 此時totalram_pages=0 totalram_pages += pages; printk("[%s %d] totalram_pages: %d.\n", __func__, __LINE__, totalram_pages); return pages; }
2 釋放highmem
start_kernel -- mem_init -- free_highpages -- free_area_high
static void __init free_highpages(void) { #ifdef CONFIG_HIGHMEM unsigned long max_low = max_low_pfn; struct memblock_region *mem, *res; /* set highmem page free */ for_each_memblock(memory, mem) { unsigned long start = memblock_region_memory_base_pfn(mem); unsigned long end = memblock_region_memory_end_pfn(mem); /* Ignore complete lowmem entries */ if (end <= max_low) continue; if (memblock_is_nomap(mem)) continue; /* Truncate partial highmem entries */ if (start < max_low) start = max_low; /* Find and exclude any reserved regions */ for_each_memblock(reserved, res) { unsigned long res_start, res_end; res_start = memblock_region_reserved_base_pfn(res); res_end = memblock_region_reserved_end_pfn(res); if (res_end < start) continue; if (res_start < start) res_start = start; if (res_start > end) res_start = end; if (res_end > end) res_end = end; if (res_start != start){ // 這裡 call printk("[%s %d] --> free_area_high.\n", __func__, __LINE__); free_area_high(start, res_start); } start = res_end; if (start == end) break; } /* And now free anything which remains */ if (start < end){ printk("[%s %d] --> free_area_high.\n", __func__, __LINE__); free_area_high(start, end); } } #endif } static inline void free_area_high(unsigned long pfn, unsigned long end) { for (; pfn < end; pfn++) free_highmem_page(pfn_to_page(pfn)); } void free_highmem_page(struct page *page) { __free_reserved_page(page); totalram_pages++; page_zone(page)->managed_pages++; totalhigh_pages++; }
3 應該還有一處,沒找到。以後找到再補充。
************************************************************************
4 釋放保留的記憶體區域
kernel_init -- free_reserved_area
unsigned long free_reserved_area(void *start, void *end, int poison, char *s) { void *pos; unsigned long pages = 0; start = (void *)PAGE_ALIGN((unsigned long)start); end = (void *)((unsigned long)end & PAGE_MASK); for (pos = start; pos < end; pos += PAGE_SIZE, pages++) { if ((unsigned int)poison <= 0xFF) memset(pos, poison, PAGE_SIZE); free_reserved_page(virt_to_page(pos)); } if (pages && s) pr_info("Freeing %s memory: %ldK\n", s, pages << (PAGE_SHIFT - 10)); return pages; } static inline void free_reserved_page(struct page *page) { __free_reserved_page(page); // totalram_pages + 1 adjust_managed_page_count(page, 1); }