关于内核虚拟地址布局的问题

关于内核虚拟地址布局的问题

我对 x86 和 x64 系统上内核的虚拟地址布局有两个疑问。

据我所知,x86使用的是highmem和lowmem分离的内存布局。

如果我的理解是正确的,highmem 和 lowmem 之间的唯一区别是它是否具有 1:1 虚拟到物理地址映射。

另外,lowmem 似乎包含内核程序经常访问的代码和数据,而 highmem 包含不经常访问的页表或用户级程序数据。

但是,我无法理解x86内核分割虚拟地址空间并将经常访问的数据和代码定位到lowmem的原因。它有什么好处呢?看来无论内核内存的位置如何,都应该调用页表遍历来获取虚拟到物理的映射。如果正确的话,好像highmem和lowmem没有什么优势。

在这里,我的第一个问题是,如果 lowmem 使用 1:1 映射(即物理地址 + 常量(0x80000000)=> 内核虚拟地址),为什么 MMU 花费其时钟来遍历页表以了解虚拟到物理的映射。如果可能的话,我们可以修改MMU逻辑,使其仅从虚拟地址中减去魔术常数即可获得物理地址(如果它位于lowmem区域)。或者是否有其他原因将经常访问的数据和代码放置到 lowmem 中?为什么只有 lowmem 使用 1:1 映射......?

我的第二个问题是“lowmem和highmem内存分割机制也部署在x64 linux系统中吗?”

提前致谢

答案1

高级内存低内存与 x86 处理器上的物理地址扩展相关。这种机制使处理器能够寻址 64GB 内存,而不是传统的 4GB。不过,由于指令集不变,寄存器和指针仍然是32位长,所以虚拟地址空间仍然限制在4GB。机器指令始终使用虚拟地址,而不是物理地址。

这样做的结果是“highmem”在被映射到可寻址区域之前根本无法直接寻址。这就是为什么只有lowmem使用1:1映射;映射到 highmem 是不可能的。

您的下一个问题是:为什么不能简化 MMU 逻辑以跳过页表并进行简单的减法来获取物理地址? MMU 在硬件中实现,它被设计为使用页表(和 TLB)来完成其工作。不过,存在“巨大”页面,它会跳过页表中的一级,使页面大小为 4MB,而不是 x86 上的 4kB。

您的最后一个问题:x64 架构上的内存也分为 lowmem 和 highmem 吗?不。PAE 机制对于延长 x86 的使用寿命来说有点拼凑。具有更大地址空间(物理和虚拟)的 x64 不需要它。

相关内容