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

标签 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 中,它需要分配内存页才能存在。 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/

相关文章:

device-driver - I2C Linux 驱动程序

linux - 即使使用有效的字符设备也会出现 "/dev/**** No such device"错误

c++ - 删除指针的后遗症

ios - iPhone NSMutableArray 和 NSKeyedUnarchiver unarchiveObjectWithFile 发布异常

c - 如何从内核记录应用程序的系统调用(包括相关参数)?

c - 如何在 Linux 内核中打印 dst_entry 的内容

c# - Hashtable 的内存是如何分配的?

ios - ARC 不允许将 'long' 转换为 'id' - iOS Dev

linux - 在 linux 中调用中断处理程序的下半部分的函数

linux - 如何解释/proc/mounts?