assembly 为什么在x86-64中,虚拟地址比物理地址短4位(48位对52位)?

qaxu7uf2  于 2022-11-13  发布在  其他
关注(0)|答案(2)|浏览(194)

在《底层编程:英特尔® 64架构上的C、汇编和程序执行“
每个虚拟的64位地址(例如,我们在程序中使用的地址)由几个字段组成,地址本身实际上只有48位宽;它的特点是它的左17位相等,如果不满足条件,则该地址在使用时立即被拒绝,然后借助特殊的表将48位虚拟地址转换成52位物理地址。
为什么虚拟地址和物理地址之间有4位的差异?

z5btuh9x

z5btuh9x1#

我相信您说的是x86-64,我的答案是基于该体系结构。
当在64位模式下运行时,CPU使用改进的功能将虚拟地址转换为物理地址,称为PAE - Physical address extension
最初发明此功能是为了打破4GiB的限制,同时仍使用32位指针,此功能涉及使用4级表。
每一个表都有一个指针指向下一个表,最右边的表给出了物理地址的高位。

所有这些表背后的基本原理是 * 稀疏性 *:用于将虚拟地址转换为物理地址的元数据非常庞大--如果我们只使用4KiB页面,则需要264 - 12 = 252个条目来覆盖整个64位地址空间。
表允许使用稀疏方法,仅将必要的条目填充到内存中。
这种设计反映在如何划分虚拟地址上(从而间接地反映在级数上),只有9位的游程被用来索引每一级的表。
从包括的位12开始,这给出:1级-〉12-20,2级-〉21-29,3级-〉30-38,4级-〉39-47。
这解释了当前实现的仅48位虚拟地址空间的限制。
请注意,在使用逻辑地址的指令级,我们完全支持64位地址。
在分段级别(将逻辑地址转换为线性地址的部分)也提供完全支持。
因此,其局限性来自PAE。
我个人的意见是,AMD急于成为第一个推出64位支持和重用PAE的x86 CPU的公司,用一个新的间接水平来修补它,以转换高达48位。
请注意,Intel和AMD都允许将来的实现使用64位虚拟地址(可能使用更多的表)。
但是,两家公司都对物理地址设置了52位的硬限制,为什么呢?
答案仍然可以在分页工作原理中找到。
在32位模式中,每个表中的每个条目是32位宽;低位被用作标志(因为对准要求使得它们对于转换过程无用),但是高位全部被用于转换,给出32/32虚拟/物理转换。
需要强调的是,所有的32位都被使用了,而一些较低的位没有被用作标志,英特尔将它们标记为“忽略”或“可用”,这意味着操作系统可以自由使用它们。
当英特尔推出PAE时,他们还需要4位(当时PAE是36位),合理的做法是将每个条目的大小 * 加倍 *,因为这样可以创建比40位表条目更高效的布局。
这给了英特尔大量的备用空间,他们将其标记为保留(在旧版本的英特尔SDM手册like this one中可以更好地观察到这一点)。
随着时间的推移,条目中需要新的属性,最著名的一个是XD/NX bit
保护密钥也是一个相对较新的特性,它占用条目中的空间。这表明,在当前伊萨中,完全的64/64位虚拟/物理转换是不可能的。
以下是64位PAE表条目的格式,以供直观参考:

它显示了64位物理地址是不可能的(对于巨大的页面,仍然有一种方法来解决这个问题,但考虑到位的布局,似乎不太可能),但没有解释为什么AMD将限制设置为52位。
嗯,很难说。
当然,物理地址空间的大小有一些与之相关的 * 硬件 * 成本:更多的引脚(虽然使用集成内存控制器,但由于DDR规格会多路复用大量信号,因此这一问题得到了缓解)和缓存/TLB中的更多空间。
在这个question(类似,但不足以使这一重复)一个答案城市维基百科,这反过来据称引用AMD,声称AMD的工程师设置的限制为52位后,适当考虑的好处和成本.
我分享Hans Passant 6年前写的话:当前的分页机制不适合完整的64位物理寻址,这可能就是为什么Intel和AMD从不费心保留每个条目中的高位的原因。
两家公司都知道,随着这项技术将接近52位的极限,它也将与目前的形式有很大不同。
到那时,他们将设计出一个更好的内存机制,所以他们避免了过度设计现有的机制。

x0fgdtte

x0fgdtte2#

前面的答案是
当然,物理地址空间的大小具有一些与之相关联的硬件成本:更多引脚[...]和缓存/TLB中的更多空间。
这暗示了作者心中的一个误解:x86-64 CPU实际上有足够的引脚来寻址252字节的RAM。
实际上,没有一个CPU拥有这么多的物理地址空间,因为套接字不支持它,所以它们也不需要该高速缓存或TLB中的位。
地址空间为52位的唯一意义在于,页表条目中的某些位被标记为保留(意味着操作系统必须将其设置为0),而其他标记为忽略(意味着OS可以将它们用于自己的目的)。保留的位刚好足够将来将物理地址空间扩展到252字节--尽管它们也可以被分配其他角色,原则上是这样。
将位分配为保留/忽略的权衡是:

  • 更少的被忽略位意味着操作系统可以在那里存储更少的信息,这可能会使它们在今天变慢。
  • 更少的保留位意味着,当数年后达到物理地址空间的限制时,页表条目格式可能不得不再次更改。

32-位的x86 CPU多年来都有36位的物理地址空间,所以物理地址空间比虚拟地址空间大是可能的,但在操作系统层面上就很尴尬了。我不相信有任何计划会发布物理地址空间比虚拟地址空间大的x86-64 CPU。英特尔最近推出了5-level paging,这将虚拟地址空间增加到257个字节。他们白色指出,CPUID返回的Intel处理器的物理地址大小为EAX= 80000008 h:
支持英特尔64体系结构的处理器最多枚举46个此值。支持5级分页的处理器应该枚举更高的值,最多52个。
我由此推断,他们目前还没有计划改变页表格式以支持超过252字节的RAM,他们也没有计划支持大于虚拟地址空间1/4的物理地址空间。后者是有意义的,因为只有一半的虚拟地址空间是为内核准备的,而将其完全填满RAM可能会很不方便。
AMD的架构手册第2卷3.38版(2021年11月)称
[T]he页面转换机制可以扩展到支持52位物理地址。[...]目前,AMD 64架构在此模式下支持40位地址,允许支持高达1 TB的物理地址空间。
AMD似乎还没有5级分页。

相关问题