我试图了解 2 个密切相关的问题。
运行后引导加载程序和启用 MMU 之前的内核代码在物理/身份映射虚拟内存中运行。这段代码如何在不同的 CPU 之间移植可能具有不同物理地址范围的 DRAM?
对于管理页表的内核来说,它需要了解哪些物理内存资源可用,包括物理内存基地址和可用物理内存,因此它不会分配超出 DRAM 范围的物理地址。
我想这在某种程度上取决于实现,但对不同架构如何处理这个问题的参考将不胜感激。到目前为止我有一些想法:
物理地址 DRAM 范围,或者至少是基地址,是在内核编译时加入的。这意味着即使使用相同的 ISA,不同的 CPU 也需要重新编译。这是由这个答案的启发在这里,其中,如果我理解正确的话,介绍对内核的基址相同的解决方案。由于基地址在编译时已知,内核代码引用文字地址而不是 DRAM/内核基地址的偏移量。
DRAM 信息与物理内存映射的其余部分一起从设备树中读取和学习。这是我的印象至少赛灵思ZYNQ的SoC,基于论坛的帖子喜欢这样。虽然这个解决方案提供了更多的灵活性,并允许我们重新编译引导加载程序而不是整个内核来移植 CPU,但它确实让我想知道我的 X86 个人机器如何在运行时检测我安装了多少 DRAM。管理页表的代码仅引用 DRAM 基地址的偏移量,并且无需跨具有不同 DRAM 物理地址范围的 CPU 重新编译即可移植。