4

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

bootz 0x80008000 0x82000000 0x81000000

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

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

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

其中k表示内核、iinitramfs、dDTB 和.未使用的空间。

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

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

4

1 回答 1

4

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

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

这意味着“kk”、“ii”和“dd”区域从一开始就一直被标记为已分配(非空闲)。

对于 ARM32:

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

于 2014-07-15T21:19:02.257 回答