根据我的系统的cpuinfo文件,我系统中的每个处理器都有一个39位的物理地址大小和一个48位的虚拟地址大小。
我的系统有16 GB的RAM,所以39位物理地址的大小对我来说是有意义的,因为39位对于16GB RAM来说已经足够了。
但是,48位虚拟地址的大小让我困惑。 我一直相信我可以编写C程序,从源代码的angular度来看,可以处理2 ^ 64字节的虚拟内存(因为根据大小(void *),我系统上的指针长度是8字节)。 但是,cpuinfo告诉我,我只有2 ^ 48字节的虚拟内存。 那么这是否意味着我的C程序只能处理2 ^ 48字节的虚拟内存?
在你的64位系统上,指针的确是64位宽的。 这意味着,指针有2 64个可能的值。
但是, 目前的x86-64(AMD64)实现只使用较低的48位。 这意味着只有2 48实际上是有效的指针和相当多的指针总是无效的。
AMD64体系结构程序员手册第2卷:系统编程状态:
目前,AMD64架构定义了将48位虚拟地址转换为52位物理地址的机制。 用于转换完整的64位虚拟地址的机制是保留的,将在未来的AMD64架构规范中进行描述。
新CPU的开发更快,更强大的执行推动了机器注册表的扩展,通常称为机器字。
内部数据寄存器的增长从较早的CPU开始,从4位(4004),8,16,32,64到128位(Alpha),以后可能会更多。
标准处理器,其主要类别是被定义为通用计算的更加扩散,具有指令指针寄存器的大小等同性以及因此寻址范围与机器自然字的主要特征之一。 所以在一个64位CPU上的IP,等内存地址,扩展到了64位。
但64位的寻址实际上是一个巨大的寻址范围,高达18.446.744.073.709.551.616字节(16.777.216T字节)。 目前的技术根本无法实现。 为此,他们决定将实际地址限制为1TB(2 ^ 40)。 这种选择降低了CPU的复杂性和功耗。
为了限制MMU寄存器(存储器管理单元寄存器)和用于页面目录的存储器的目的相同,决定将虚拟存储器限制为256TB(2 ^ 48)。
考虑到扩展存储器寻址线甚至在存储器地址解码时也变得更加复杂,需要更多的逻辑门,这又需要更多的功率并且减慢解码时序,然后减慢存储器访问周期。
在实际系统中,每个具有最后16位设置的虚拟地址或物理地址都会触发内存访问异常。
总之,64位对于一般计算是有利的,但是在寻址中不是有效的,但是memory pointer size = machine natural integer size
仍然是可取的,所以…