为什么在64位虚拟地址与物理地址(52位长)相比,4位短(48位长)?

时间:2017-10-01 04:17:15

标签: assembly memory-management memory-address virtual-memory mmu

在“基于英特尔®64架构的低级编程:C,汇编和程序执行”一书中,我读到:

  

每个虚拟64位地址(例如,我们在程序中使用的地址)   由几个领域组成。地址本身实际上只有48位   宽;它被符号扩展为64位规范地址。它的   特征是它的17个左位是相等的。如果条件是   不满意,地址在使用时立即被拒绝。然后   48位虚拟地址被转换为52位物理   在特殊表格的帮助下解决。

为什么虚拟地址和物理地址之间的差异为4位?

1 个答案:

答案 0 :(得分:13)

我相信你在谈论x86-64,我的回答是基于这种架构。

在64位模式下运行时,CPU使用经过改进的功能将虚拟地址转换为称为PAE - Physical address extension的物理地址。
最初发明的目的是在使用32位指针时打破4GiB限制,此功能涉及使用4级表。
每个表都给出了一个指向下一个表的指针,一个指向最右边的表,它给出了物理地址的高位。想要了解AMD64 Architecture Programming Manual

中的这张图片

4-Level paging, PAE, in long mode

所有这些表背后的基本原理是稀疏性:将虚拟地址转换为物理地址的元数据非常庞大 - 如果我们只使用4KiB页面,我们需要2 64 - 12 = 2 52 条目覆盖整个64位地址空间 表允许稀疏方法,只有必要的条目填充在内存中。

这种设计反映在如何划分虚拟地址(因此,间接地,在层数上),只使用9位运行来索引每个级别的表。
从包含的第12位开始,这给出:级别1 - > 12-20,等级2 - > 21-29,3级 - > 30-38,等级4 - > 39-47。

这解释了当前仅48位虚拟地址空间的实现限制 请注意,在使用逻辑地址的指令级别,我们完全支持64位地址 分段级别也提供完全支持,即将逻辑地址转换为线性地址的部分 所以限制来自PAE。

我的个人意见是AMD急于成为第一个发布支持64位的x86 CPU并重新使用PAE,用新的间接级别修补它以转换为48位。
请注意,Intel和AMD都允许将来的实现使用64位作为虚拟地址(可能包含更多表)。

但是,两家公司都为物理地址设置了52位的硬限制。 为什么呢?

答案仍然可以在寻呼工作中找到答案 在32位模式下,每个表中的每个条目都是32位宽;低位用作标志(因为对齐要求使它们对于转换过程无用)但是较高的位全部用于转换,提供32/32虚拟/物理转换。
重要的是要强调所有32位都被使用,而一些低位不用作标志,英特尔将它们标记为“忽略”或“可用”,这意味着操作系统可以自由使用它们。

当英特尔推出PAE时,他们还需要4位(PAE当时是36位),逻辑上要做的是加倍每个条目的大小,因为这样可以创建比a,比方说,40位表项 这为英特尔提供了大量的备用空间,并将其标记为保留(这在旧版本的英特尔SDM手册中可以更好地观察到,like this one)。

随着时间的推移,条目中需要新的属性,最着名的是XD/NX bit 保护键也是一种相对较新的功能,可在条目中占用空间。 这表明当前的ISA不再能够进行完整的64/64位虚拟/物理转换。

对于可视参考,以下是64位PAE表条目的格式:

Intel 64-bit PAE table entries

它表明64位物理地址是不可能的(对于大页面仍然有办法解决这个问题,但考虑到这些位的布局似乎不太可能)但是没有解释为什么AMD将限制设置为52位。

嗯,很难说 当然,物理地址空间的大小有一些与之相关的硬件成本:更多的引脚(尽管使用集成的内存控制器,这可以减轻DDR规范复用大量信号)和更多空间在缓存/ TLB中 在这个question(类似但不足以使其重复)的答案城市维基百科,反过来据称引用AMD,声称AMD的工程师在考虑到收益和成本后将限制设置为52位。

我分享Hans Passant wrote more than 6 years ago:当前的分页机制不适合完整的64位物理寻址,这可能就是为什么英特尔和AMD都不会为保留每个条目中的高位而烦恼的原因。

两家公司都知道,随着技术接近52位的限制,它也将与实际形式大不相同 当他们设计一个更好的内存机制时,他们避免过度设计现有的机制。