cod*_*odd 5 memory x86 linux-kernel
上下文:我正在阅读使用 2.6.11 内核的“Understanding the Linux kernel, 3d ed”。
问:据我了解,物理地址是通过平移线性地址获得的,线性地址是通过平移逻辑地址获得的。逻辑地址由段选择器组成,用于标识描述表中的段
Linux 全局描述表包括用户代码和数据段等部分。但是两个段的基地址都是0x0,大小也一样。所以它们完全重叠。因此,据我所知,逻辑地址cs + offset与逻辑地址相同ds + offset,其中cs和ds是分别保存代码段选择器和数据段选择器的 CPU 寄存器。我认为是这种情况,因为两个段都有相同的基地址,随着偏移量递增以获得线性地址。
如果是这种情况,并且它们都映射到相同的线性地址,那么它们不也映射到相同的物理地址吗?如果是这样,单独的cs和ds寄存器有什么用?
分段寄存器是 x86 处理器早期的遗留物,当时它offset不足以寻址处理器可以寻址的所有内存。最初的8086有 20 位地址空间,但只能使用 16 位偏移量。您必须使用段寄存器来指定您想要的 1024KB 地址空间中的哪 64KB。段寄存器实际上是 20 位寄存器,其中最低 4 位被强制为 0。加载段寄存器设置寄存器的高 16 位。这允许segment + offset覆盖整个 20 位地址空间。
段寄存器仍然存在,但 Linux 将它们设置为 0,因此它可以假装它们不存在。现代 x86 处理器(意味着80386和更新的处理器)可以使用足够大的偏移量来覆盖其所有地址空间,从而使内存分段成为一种不再需要的复杂性。阅读x86 内存分段和平面内存模型了解更多细节。