我正在浏览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分配器被禁用和正常伙伴之前,不会设置正确的值 分配生效。
有人可以指向此部分设置为默认起始值的实际位置吗?
非常感谢
答案 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