为什么在 x86-64 中虚拟地址比物理地址短 4 位(48 位对 52 位长)?
Why in x86-64 the virtual address are 4 bits shorter than physical (48 bits vs. 52 long)?
在《低级编程:英特尔® 64 架构上的 C、汇编和程序执行》一书中,我读到:
Each virtual 64-bit address (e.g., ones we are using in our programs)
consists of several fields. The address itself is in fact only 48 bits
wide; it is sign-extended to a 64-bit canonical address. Its
characteristic is that its 17 left bits are equal. If the condition is
not satisfied, the address gets rejected immediately when used. Then
48 bits of virtual address are transformed into 52 bits of physical
address with the help of special tables.
为什么虚拟地址和物理地址相差4位?
我相信你在谈论 x86-64,我的回答是基于那个架构。
在 64 位模式下运行时,CPU 使用改进的功能将虚拟地址转换为物理地址,称为 PAE - Physical address extension。
最初发明是为了打破 4GiB 的限制,同时仍然使用 32 位指针,此功能涉及使用 4 级 tables.
每个 table 都给出一个指向下一个 table 的指针,一直到最右边的那个给出了物理地址的高位。看看这张来自 AMD64 Architecture Programming Manual 的图片:
所有这些 table 背后的基本原理是 稀疏性 :将虚拟地址转换为物理地址的元数据是巨大的 - 如果我们只使用 4KiB 页面,我们需要 264 - 12 = 252 个条目来覆盖整个 64 位地址 space.
表格允许采用稀疏方法,只有必要的条目才会填充到内存中。
这种设计反映在虚拟地址的划分方式上(因此,间接地反映在级别数上),仅使用 9 位运行来索引每个级别的 tables。
从包含的第 12 位开始,这给出:级别 1 -> 12-20,级别 2 -> 21-29,级别 3 -> 30-38,级别 4 -> 39-47。
这解释了目前虚拟地址只有48位的实现限制space。
请注意,在使用逻辑地址的指令级别,我们完全支持 64 位地址。
分段级别也提供全面支持,将逻辑地址转换为线性地址的部分。
所以限制来自PAE。
我的个人观点是 AMD 急于成为第一个推出 x86 CPU 支持 64 位和重用 PAE 的公司,并用新级别修补它间接翻译最多 48 位。
请注意,Intel 和 AMD 都允许未来的实现使用 64 位作为虚拟地址(可能有更多 tables)。
但是,两家公司都为物理地址设置了 52 位的硬限制。
为什么?
答案仍然可以在分页的工作原理中找到。
在 32 位模式下,每个 table 中的每个条目都是 32 位宽;低位用作标志(因为对齐要求使它们对翻译过程无用)但高位全部用于翻译,给出 32/32 virtual/physical 翻译。
重要的是要强调所有的 32 位都被使用了,而一些较低的位没有被用作标志,英特尔将它们标记为“忽略”或“可用”,这意味着 OS 可以免费使用他们。
当英特尔引入 PAE 时,他们还需要 4 位(PAE 当时是 36 位),合乎逻辑的做法是 双倍 每个条目的大小,因为这会创建比 40 位 table 条目更有效的布局。
这给了 Intel 很多备用 space,他们将其标记为保留(这可以在旧版本的 Intel SDM 手册中更好地观察到,like this one)。
随着时间的推移,条目中需要新属性,最著名的是 XD/NX bit。
保护密钥也是一项相对较新的功能,在条目中使用 space。
这表明当前的 ISA 不再可能进行完整的 64/64 位 virtual/physical 转换。
作为视觉参考,这里是 64 位 PAE table 条目的格式:
它表明 64 位物理地址是不可能的(对于大页面,仍然有办法解决这个问题,但考虑到似乎不太可能的位布局)但没有解释为什么 AMD 设置了限制到 52 位。
嗯,很难说。
当然,物理地址的大小 space 有一些与之相关的 硬件 成本:更多的引脚(尽管使用集成内存控制器,但由于 DDR 规范复用了一个很多信号)和更多 space 在 caches/TLBs.
在此question(相似但不足以使其重复)维基百科的答案据称引用了 AMD,声称 AMD 的工程师在适当考虑收益和成本后将限制设置为 52 位。
我分享一下 Hans Passant wrote more than 6 years ago:当前的分页机制不适合 table 完整的 64 位物理寻址,这可能是英特尔和 AMD 从不费心保留高位的原因在保留的每个条目中。
两家公司都知道,随着技术将接近 52 位限制,它也将与目前的形式大不相同。
到那个时候,他们通常会设计出更好的记忆机制,因此他们会避免对现有机制进行过度设计。
在《低级编程:英特尔® 64 架构上的 C、汇编和程序执行》一书中,我读到:
Each virtual 64-bit address (e.g., ones we are using in our programs) consists of several fields. The address itself is in fact only 48 bits wide; it is sign-extended to a 64-bit canonical address. Its characteristic is that its 17 left bits are equal. If the condition is not satisfied, the address gets rejected immediately when used. Then 48 bits of virtual address are transformed into 52 bits of physical address with the help of special tables.
为什么虚拟地址和物理地址相差4位?
我相信你在谈论 x86-64,我的回答是基于那个架构。
在 64 位模式下运行时,CPU 使用改进的功能将虚拟地址转换为物理地址,称为 PAE - Physical address extension。
最初发明是为了打破 4GiB 的限制,同时仍然使用 32 位指针,此功能涉及使用 4 级 tables.
每个 table 都给出一个指向下一个 table 的指针,一直到最右边的那个给出了物理地址的高位。看看这张来自 AMD64 Architecture Programming Manual 的图片:
所有这些 table 背后的基本原理是 稀疏性 :将虚拟地址转换为物理地址的元数据是巨大的 - 如果我们只使用 4KiB 页面,我们需要 264 - 12 = 252 个条目来覆盖整个 64 位地址 space.
表格允许采用稀疏方法,只有必要的条目才会填充到内存中。
这种设计反映在虚拟地址的划分方式上(因此,间接地反映在级别数上),仅使用 9 位运行来索引每个级别的 tables。
从包含的第 12 位开始,这给出:级别 1 -> 12-20,级别 2 -> 21-29,级别 3 -> 30-38,级别 4 -> 39-47。
这解释了目前虚拟地址只有48位的实现限制space。
请注意,在使用逻辑地址的指令级别,我们完全支持 64 位地址。
分段级别也提供全面支持,将逻辑地址转换为线性地址的部分。
所以限制来自PAE。
我的个人观点是 AMD 急于成为第一个推出 x86 CPU 支持 64 位和重用 PAE 的公司,并用新级别修补它间接翻译最多 48 位。
请注意,Intel 和 AMD 都允许未来的实现使用 64 位作为虚拟地址(可能有更多 tables)。
但是,两家公司都为物理地址设置了 52 位的硬限制。 为什么?
答案仍然可以在分页的工作原理中找到。
在 32 位模式下,每个 table 中的每个条目都是 32 位宽;低位用作标志(因为对齐要求使它们对翻译过程无用)但高位全部用于翻译,给出 32/32 virtual/physical 翻译。
重要的是要强调所有的 32 位都被使用了,而一些较低的位没有被用作标志,英特尔将它们标记为“忽略”或“可用”,这意味着 OS 可以免费使用他们。
当英特尔引入 PAE 时,他们还需要 4 位(PAE 当时是 36 位),合乎逻辑的做法是 双倍 每个条目的大小,因为这会创建比 40 位 table 条目更有效的布局。
这给了 Intel 很多备用 space,他们将其标记为保留(这可以在旧版本的 Intel SDM 手册中更好地观察到,like this one)。
随着时间的推移,条目中需要新属性,最著名的是 XD/NX bit。
保护密钥也是一项相对较新的功能,在条目中使用 space。
这表明当前的 ISA 不再可能进行完整的 64/64 位 virtual/physical 转换。
作为视觉参考,这里是 64 位 PAE table 条目的格式:
它表明 64 位物理地址是不可能的(对于大页面,仍然有办法解决这个问题,但考虑到似乎不太可能的位布局)但没有解释为什么 AMD 设置了限制到 52 位。
嗯,很难说。
当然,物理地址的大小 space 有一些与之相关的 硬件 成本:更多的引脚(尽管使用集成内存控制器,但由于 DDR 规范复用了一个很多信号)和更多 space 在 caches/TLBs.
在此question(相似但不足以使其重复)维基百科的答案据称引用了 AMD,声称 AMD 的工程师在适当考虑收益和成本后将限制设置为 52 位。
我分享一下 Hans Passant wrote more than 6 years ago:当前的分页机制不适合 table 完整的 64 位物理寻址,这可能是英特尔和 AMD 从不费心保留高位的原因在保留的每个条目中。
两家公司都知道,随着技术将接近 52 位限制,它也将与目前的形式大不相同。
到那个时候,他们通常会设计出更好的记忆机制,因此他们会避免对现有机制进行过度设计。