初始化存储区中每个顺序中的空闲页数

时间:2014-02-15 16:22:31

标签: c linux memory-management kernel

我正在浏览linux内核中的内存初始化代码,我可以看到免费的数量 每个订单的页面和内存节点中每个内存区域的迁移类型都设置为0.

static void __meminit zone_init_free_lists(struct zone *zone)
{
int order, t;
for_each_migratetype_order(order, t) {
INIT_LIST_HEAD(&zone->free_area[order].free_list[t]);
zone->free_area[order].nr_free = 0;
}
}

我无法弄清楚列表是如何设置为正确状态的,因为在哪个顺序中有多少默认值 要开始的页面,或者我们从最高顺序的所有条目开始。

在书中,我读了以下内容:

  

空闲页面数(nr_free)目前仍被定义为0,这显然不会反映出来   真实的情况。在bootmem分配器被禁用和正常伙伴之前,不会设置正确的值   分配生效。

有人可以指向此部分设置为默认起始值​​的实际位置吗?

非常感谢

1 个答案:

答案 0 :(得分:0)

有一个电话mem_init(),它标记了mem_map中的空闲区域,并告诉我们有多少内存空闲。这是在系统的各个部分在内核映像之后声明其内存之后完成的。

进一步调用free_unused_memmap()free_all_bootmem() api来释放内存(以页为单位),并将可用内存块(以页为单位)添加到不同的顺序free_lists中。

您可以使用show_free_areas()打印区域(Normal,Highmem等)相关信息。

释放所有启动和其他mem_map相关内存之前/之后show_free_areas()的结果。

<强>之前:

正常免费: 0kB ...目前:778240kB管理:772160kB ......等

HighMem免费: 0kB ...目前:270336kB管理:270336kB ......等

正常:0 * 4kB 0 * 8kB 0 * 16kB 0 * 32kB 0 * 64kB 0 * 128kB 0 * 256kB 0 * 512kB 0 * 1024kB 0 * 2048kB 0 * 4096kB = 0kB

HighMem:0 * 4kB 0 * 8kB 0 * 16kB 0 * 32kB 0 * 64kB 0 * 128kB 0 * 256kB 0 * 512kB 0 * 1024kB 0 * 2048kB 0 * 4096kB = 0kB

<强>后:

正常免费: 542868kB ...目前:778240kB管理:542868kB ......等

HighMem免费: 270336kB ...目前:270336kB管理:270336kB ......等

正常:5 * 4kB(M)2 * 8kB(M)3 * 16kB(M)4 * 32kB(M)3 * 64kB(M)4 * 128kB(M)3 * 256kB(M)7 * 512kB (M)7 * 1024kB(M)9 * 2048kB(M)125 * 4096kB(M)= 542868kB

HighMem:0 * 4kB 0 * 8kB 0 * 16kB 0 * 32kB 0 * 64kB 0 * 128kB 0 * 256kB 0 * 512kB 0 * 1024kB 0 * 2048kB 66 * 4096kB(M)= 270336kB