linux内核合并dtb文件,Linux内核启动:当DTB和initramfs最初在内存中时,如何完成内存分配?...

引导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案例的答复。 让我知道您是否对其他体系结构也感兴趣。

这完美地回答了我的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值