gpt4 book ai didi

memory-management - Linux 内核启动 : how is memory allocation done when DTB and initramfs are initially in memory?

转载 作者:行者123 更新时间:2023-12-01 23:54:37 33 4
gpt4 key购买 nike

引导 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 中,它需要分配内存页才能存在。 DTB 文件用于填充内部树,该树还为其数据结构分配页面。

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

最佳答案

当 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]内存(除了其他保留区域)。

关于memory-management - Linux 内核启动 : how is memory allocation done when DTB and initramfs are initially in memory?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24746283/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com