我正在浏览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,这显然没有反映 真实情况。在禁用引导分配器并正常好友之前,不会设置正确的值 分配生效。
有人可以指出此部分设置为默认起始值的实际位置吗?
多谢
有一个调用mem_init()
,它标记了mem_map
中的空闲区域,并告诉我们有多少内存是可用的。这是在系统的各个部分在内核映像之后声明其内存之后完成的。
这进一步调用free_unused_memmap()
和free_all_bootmem()
API来释放内存(以页为单位),并将可用内存块(以页为单位)添加到不同的顺序free_lists
。
您可以使用show_free_areas()
打印区域(正常,高等)相关信息。
释放所有启动和其他mem_map相关内存之前/之后show_free_areas()
的结果。
以前:
正常免费:0kB ...当前:778240kB 托管:772160kB ...等
高内存免费: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
高内存: 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 ...等
免费内存: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
高内存: 0*4kB 0*8kB 0*16kB 0*32kB 0*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 66*4096kB (M) =270336kB