合聚咖

合聚咖

(二)Linux 内存初始化-看见DTB

admin

本文代码基于ARM64平台, Linux kernel 5.15

在Linux 进行启动阶段的内存初始化之后,需要解决如何获取到当前系统的内存信息。这些信息一般在DTB中进行描述,通过bootloader将DTB的物理地址传递给kernel。kernel通过映射物理地址到特定的虚拟地址,即fixmap,来访问DTB。

为了访问DTB,kernel规划了fixmap,其中一部分虚拟地址用于映射DTB。fixmap页表被静态定义在内核镜像的bss段中,通过init_pg_dir映射。这部分页表用于将fixmap虚拟地址映射为物理地址。

为了更好地管理fixmap,其进一步细分,包含用于映射DTB的虚拟地址空间,以及用于其他特定功能的地址空间。其中,用于映射DTB的虚拟地址空间为4M,考虑到DTB可能跨过2M物理地址边界,采用4M空间以确保完整映射。

fixmap的其他部分包括用于映射earlycon的虚拟地址空间、用于代码段指令操作的地址空间、用于ACPI_APEI_GHES的地址空间、用于内核安全增强的地址空间以及用于early ioremap的bitmap空间等。

fixmap的初始化主要工作是建立bm_pud、bm_pmd、bm_pte之间的映射关系。映射DTB的过程分为两次,首先建立2M区域的映射,然后根据DTB物理地址是否跨越2M边界进行第二次映射,确保完整获取DTB信息。

在获取到DTB信息后,就可以通过虚拟地址访问DTB,从而获取到系统内存信息,包括内存大小、地址范围、是否存在空洞等。这些信息对于系统配置和管理具有重要意义。

参考资料:内存管理(四):DTB的映射_dtb放在内存哪里_念念有余的博客-CSDN博客