【发布时间】:2018-03-12 13:24:43
【问题描述】:
在“低级编程:英特尔® 64 架构上的 C、汇编和程序执行”一书中,我读到:
每个虚拟 64 位地址(例如,我们在程序中使用的地址) 由几个字段组成。地址本身实际上只有 48 位 宽的;它被符号扩展为 64 位规范地址。它的 特点是它的左17位相等。如果条件是 不满意,地址在使用时立即被拒绝。然后 48位虚拟地址转化为52位物理地址 借助特殊表格的地址。
为什么虚拟地址和物理地址相差4位?
【问题讨论】:
-
反问:为什么虚拟地址和物理地址要一样大? 1980 年代使用超过 48k 内存的 8 位计算机也使用“内存银行”,这或多或少意味着物理地址位多于虚拟地址位。
-
@MartinRosenau 很抱歉,您认为我的问题暗示 我认为虚拟地址和物理地址应该具有相同的大小。我的目的只是想问为什么在那个特殊情况下会有所不同。我发现您在评论中写的类似内容,但与“现代 PC”和 64 位寻址有关。
-
有趣的事实:如果你想使用高 16 位标记指针,你可以在使用重做符号扩展之前
shl rax,16/sar rax,16。 (或者更好的是,让您的程序仅在规范范围的低半部分分配标记指针,因此您可以使用and或 BMI2andn使地址规范。)或者更好的是,仅在 4G 的低端分配虚拟地址空间,因此您可以使用地址大小 (0x67) 前缀来忽略高垃圾,或者在操作指针时使用 32 位操作数大小以免费对其进行零扩展。 -
我猜如果/当硬件支持更广泛的虚拟地址时,可能会有一个
mmap(MAP_48BIT)标志等同于当前的mmap(MAP_32BIT)所以程序想要使用高 16 位为自己的目的可以继续这样做。仅使用高字节可能会更安全,因为将虚拟扩展到物理之外的可能性较小,即使内存映射的非易失性存储成为一种东西。 (例如,DIMM 上的速度比闪存快。)
标签: assembly x86-64 memory-address virtual-memory mmu