【问题标题】:Initialization of number of free pages in each order in a memory zone初始化内存区域中每个顺序的空闲页数
【发布时间】:2014-02-15 16:22:30
【问题描述】:

我正在浏览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 分配器被禁用并且正常的伙伴才设置正确的值 分配生效。

有人能指出这部分设置为默认起始值​​的实际位置吗?

非常感谢

【问题讨论】:

    标签: c linux memory-management kernel


    【解决方案1】:

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

    它进一步调用free_unused_memmap()free_all_bootmem() api 来释放内存(以页为单位)并将空闲内存块(以页为单位)添加到不同的订单free_lists

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

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

    之前:

    正常免费: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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-12
      • 1970-01-01
      • 1970-01-01
      • 2010-09-17
      • 1970-01-01
      相关资源
      最近更新 更多