引导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文件?在不再需要原始数据时,这些文件所占用的物??理页面是否在最终释放之前被映射并标记为已使用?
初始化bootmem分配器时,内核会将可用/可用的RAM范围传递给它。 内核不将自己的内核dtb和initramfs视为可用/可用ram范围的一部分。 这意味着这些范围被标记为已使用(已分配)。
[在启动期间,活动分配器是bootmem分配器。 在启动的后期阶段将其丢弃,而转而使用其他更高级的分配器,例如伙伴分配器(用于页面分配)和slub / slab / slob。 ]
这意味着从一开始就始终将" kk"," ii"和" dd"区域标记为已分配(不是free)。
对于ARM32:
" arm_memblock_init" [1](从setup_arch [2]调用)负责添加所有可用的内存区域[3],然后保留" kernel" [4]," initrd" [5]和" 设备树" [6]内存(除其他保留区域外)。
谢谢KarimRaslan,这很有帮助。 您能否在当前内核源代码中(使用一些在线LXR)添加指向特定文件/行的链接,其中"内核将可用/自由内存范围传递给它"(这将显示未考虑DTB,内核和initramfs区域) 免费)会发生在ARM吗? 谢谢!
eepp,我已经更新了ARM32案例的答复。 让我知道您是否对其他体系结构也感兴趣。
这完美地回答了我的问题。