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);
}