linux启动过程中 totalram_pages 的计算过程

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

猜你喜欢

转载自blog.csdn.net/yinming4u/article/details/84580803
今日推荐