以前看视频听到一句话 说 64位的操作系统 用16进制表示 给内存分配的编号 0xffffffffffffffff,但是实际给应用程序分配的内存地址在0X7FFFFFFFFFFFFFFF,为什么说实际只用到了48位
因为目前还用不到那么多内存,为了硬件设计简单和降低功耗,并向后兼容未来的软件,因此设计。
64位CPU理论上支持64位地址,这是程序员可以使用的地址空间,如果不涉及到系统底层,基本
上就可以这样认为。但是在硬件实现上,64位地址空间太大了,程序员永远不可能用到那么大
的地址,如果要把64位地址空间都映射到物理地址上,会造成映射过程不必要的开销。AMD64保
留了这一做法,一般只把48位地址映射到物理地址上,高于48位的地址是48位(从0开始
编号是第47位)的扩展,忽略不计。通常说的虚拟地址,指的就是这个64位或者48位地址。
那么物理地址是多少位呢?AMD64架构说是52位,实现时因情况而异。地址转换过程就是把64
位可编程的虚拟地址(实际底层用的是48位)映射到52位物理地址空间。这个过程用了很多层
查询表,感兴趣可以看看Linux内核代码的实现。
Intel 64位CPU情况类似,在实际映射时位数有所不同。
以下引用 AMD64 Architecture Programmer’s Manual Volume 2: System Programming 中
5.1 Page Translation Overview 的一段话:
Currently, the AMD64 architecture defines a mechanism for translating 48-bit
virtual addresses to 52-bit physical addresses. The mechanism used to translate
a full 64-bit virtual address is reserved and will be described in a future
AMD64 architectural specification.
也可参考 https://en.wikipedia.org/wiki/X86-64#Virtual_address_space_details
希望能帮到你。 :)