x86-64引技术实际上是在x86平台上从32位到64位的一次扩充。而这一扩充包含的内容能够不仅仅体现在对物理内存的扩充上,在指令集、CPU寄存器结构、甚至是应用程序的虚拟内存上都得到了非常大的扩充。然而,值得注意的是,x86从32位到64位的变化,并没有象以前从16位到32位的变化那样,在系统软件层面带来了革命性的变化(例如页式地址管理、多任务的引入等等)。我们的操作系统仍然使用以前的各种机制来对硬件进行管理,只是在64位平台上,数据(如整型数)变得更宽了,线性地址以及物理地址也都变得更宽了。
虚拟地址
虽然逻辑地址扩展到了64位,但是,现有的设计并没有完全用到这64位的空间(2^64=16EB),因为使用到如此大的空间,势必造成很大的系统开销。AMD64在设计的时候就决定在x86-64的第一阶段,只用这64位中的低48位来做页式地址转换,高16位(48-64位)将填充第47位相同的内容(这种方式类似于符号扩展)。如果逻辑地址不符合此规定,系统将产生异常。符合此规定的地址称为canonical form,地址的范围分为两段:0 到 00007FFF-FFFFFFFF,以及FFFF8 000-0000 0000到FFFFFFFF-FFFFFFFF,总共为256TB。这种虚拟地址的分层结构,也为操作系统的设计带来了一定便利:可以取地址的上半段保留做为操作系统的逻辑地址空间,而低地址部分做为装载应用程序的空间,而canonical form不允许的地址空间则做为操作系统的标志、以及特权级的标识等。当然,这样的设计在未来地址进一步扩展的时候将称为一个新的问题。
下图展示了今天的设计以及未来可能的扩展:
采用64位地址空间的x86-86被称为是运行在"长模式"(long mode)下,该模式可以看成是对PAE模式的一个扩充。长模式允许使用三个不同的物理页面大小:4KB、2MB和1GB。在使用64位中的48位用来存放地址时,与PAE模式下的三级页面映射机制不同的是,长模式下线性地址到物理地址的映射需要经过四级地址映射。在这四级地址映射机制中,原来PAE模式下仅拥有4个表项的页目录指针表被扩展到512个表项。同时,在最末一级加入一级新的页面映射结构,该结构被称为第四级页表(Page-Map Level 4 Table,PML4),它跟PAE模式下的页目录及页表(在长模式中,成为了页目录)一样,拥有512个表项。如果地址进一步扩充,如把64位寻址全部用上,该页表就能够扩充到33,554,432个表项,或者干脆再加一层地址映射(PML5),当然,按照目前只用了48位的情况下,用到512个表项的PML4就已经够用了。
可以想象,用到48位的x86-64虚拟地址的分配机制为:
0-11(12)位:页内偏移;
12-20(9)位:由PML4来映射;
21-29(9)位:高一级页目录来映射(如果PS=1,则该页表项指向一个2MB的页);
30-38(9)位:再高一级的页目录来映射(如果PS=2,则该页表项指向一个1GB的页);
39-47(9)位:页目录指针表来映射。
x86-64的长模式下,对16位以及32位代码进行了兼容,即使CPU上跑的是64位的操作系统,历史遗留的16位以及32位代码将都能够在该操作系统上运行。由于x86-64兼容IA32的指令,所以,这些代码在这种情况下运行,基本上没有性能损耗。
在传统模式(Legacy mode)下,x86-64的CPU的工作模式跟传统的IA32没有什么两样。