gsi*_*ank 12 assembly memory-management virtual-memory memory-address mmu
在"低级编程:英特尔®64架构上的C,汇编和程序执行"一书中,我读到:
每个虚拟64位地址(例如,我们在程序中使用的地址)由几个字段组成.地址本身实际上只有48位宽; 它被符号扩展为64位规范地址.它的特点是它的17个左位是相等的.如果不满足条件,则在使用时立即拒绝该地址.然后借助特殊表将48位虚拟地址转换为52位物理地址.
为什么虚拟地址和物理地址之间的差异为4位?
Mar*_*oom 16
我相信你在谈论x86-64,我的答案是基于该架构.
在64位模式下运行时,CPU使用经过改进的功能将虚拟地址转换为称为PAE的物理地址 - 物理地址扩展.
最初发明的目的是在使用32位指针时打破4GiB限制,此功能涉及使用4级表.
每个表都给出了一个指向下一个表的指针,一个指向最右边的表,它给出了物理地址的高位.想要了解AMD64架构编程手册中的这张图片:
所有这些表背后的基本原理是稀疏:对于虚拟地址转换成物理地址的元数据是巨大的-如果我们使用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位),逻辑上要做的是将每个条目的大小加倍,因为这样可以创建比40位表条目更高效的布局.
这为英特尔提供了大量的备用空间,并将其标记为保留(在旧版本的英特尔SDM手册中可以更好地观察到这一点,就像这个一样).
随着时间的推移,条目中需要新的属性,最着名的是XD/NX位.
保护键也是一种相对较新的功能,可在条目中占用空间.这表明当前的ISA不再能够进行完整的64/64位虚拟/物理转换.
对于可视参考,以下是64位PAE表条目的格式:
它表明64位物理地址是不可能的(对于大页面,仍有一种方法可以解决这个问题,但考虑到似乎不太可能的位布局),但没有解释为什么AMD将限制设置为52位.
嗯,这很难说.
当然,物理地址空间的大小具有与之相关的一些硬件成本:更多的引脚(尽管使用集成的存储器控制器,这可以在DDR规范中复用大量信号时减轻)以及缓存/ TLB中的更多空间.
在这个问题(类似但不足以使其重复)的答案城市维基百科,反过来据称引用AMD,声称AMD的工程师在考虑到收益和成本后将限制设置为52位.
我分享了Hans Passant在6年多前所写的内容:目前的分页机制并不适合完整的64位物理寻址,这可能就是为什么英特尔和AMD都不会为保留每个条目中的高位而烦恼的原因.
两家公司都知道,随着技术接近52位的限制,它也将与实际形式大不相同.
当他们为一般的内存设计更好的机制时,他们避免过度设计现有的机制.
归档时间: |
|
查看次数: |
2304 次 |
最近记录: |