Linux内核启动:当DTB和initramfs最初在内存中时,如何完成内存分配?

时间:2014-07-14 21:28:18

标签: memory-management linux-kernel embedded-linux boot device-tree

启动Linux内核时,可以在RAM中加载initramfs存档和DTB文件,并为内核指定这些物理地址。例如,使用U-Boot,你可以这样做:

bootz 0x80008000 0x82000000 0x81000000

表示:启动内核映像位于内存地址0x80008000,并指定内核initramfs存档位于0x82000000,DTB文件位于0x81000000。在这个例子中,它是一个ARM系统,但我的问题适用于所有系统。

当这三个文件加载到RAM中时,RAM可能如下所示:

[...kkkkk..........iii.............dd............................... ... ..]

其中k表示内核,i initramfs,d DTB和.未使用的空间。

initramfs存档被提取到ramfs中,ramfs需要分配存在的内存页面。 DTB文件用于填充内部树,该树还为其数据结构分配页面。

在分配页面时,内核如何避免覆盖内存中的initramfs和DTB文件?当不再需要原始数据时,这些文件所采用的物理页面是否被映射并标记为已使用,最终被释放?

1 个答案:

答案 0 :(得分:3)

初始化bootmem分配器时,内核将可用/自由ram范围传递给它。内核不会将自己的内核,dtb和initramfs视为可用/自由ram范围的一部分。这意味着这些范围标记为已使用(已分配)。

[在启动期间,活动分配器是bootmem分配器。这在启动的后期被丢弃,有利于其他更高级的分配器,如伙伴分配器(用于页面分配)和slub / slab / slob。 ]

这意味着" kk"," ii"," dd"区域始终从头开始标记为已分配(非自由)。

对于ARM32:

" arm_memblock_init" [1](从setup_arch [2]调用)负责添加所有可用的内存区域[3],然后保留"内核" [4]," initrd" [5]和"设备树" [6]内存(除了其他保留区域)。