现在电脑里的x86处理器和手机里的ARM处理器都是64位的。通常对于消费级产品,是支持x86-64指令集的x86处理器,或者是支持ARM64指令集的ARM处理器。其实早在20世纪60年代,64位CPU就已经在超级计算机中使用,到了90年代,64位处理器开始在工作站和服务器中使用。个人电脑只是在AMD于2003年推出Athlon 64之后才开始流行,而用于智能手机的64位处理器ARMv8-A架构是在2011年发布的。
这里的64位是指CPU的位宽。简单来说,CPU的位宽是指CPU在一个时钟周期内能够处理的二进制位数。比如8086 CPU是16位,一次可以处理2个字节(16位),80386 CPU是32位,一次可以处理4个字节。目前CPU基本是64位,一次可以处理8个字节。我们的Windows操作系统也分32位和64位,主要是针对以上CPU的位宽。比如32位CPU不能使用64位Windows(因为CPU一次只能处理32位,而操作系统给你的指令是处理64位),但是64位CPU既可以运行32位Windows,也可以运行64位Windows。
64位CPU优优资源网的优势在于可以在更大范围内进行整数运算,高吞吐量的程序运行速度会更快。但是,人们往往对CPU的位宽有一些误解。比如有人说CPU升级到64位支持更大内存,也有人认为32位系统只支持4GB内存。这是真的吗?
最大内存容量和CPU的位宽有关系吗?
CPU的寻址能力与其地址总线位宽有关,而我们通常所说的CPU位宽是指数据总线位宽。与地址总线位宽无关,自然也与寻址能力无关。
总线位宽等于CPU整数寄存器的位宽。CPU中通常有三种类型的寄存器:整数寄存器、浮点寄存器和其他。在这三类寄存器中,只有整数寄存器可以存储指针值,即内存数据地址,非整数寄存器不能存储指针值。因此,读写内存操作无法避免整数寄存器的位宽限制。以64位CPU为例,这些CPU的内部整数寄存器位宽为64位,支持整数64位的算术和逻辑运算。
但并不意味着64位CPU的所有总线和寄存器都是64位的,不同类型的寄存器可以有不同的位宽。上面说的64位CPU的整数寄存器位宽是64位,浮点寄存器不一样。例如,奔腾MMX处理器推出的MMX指令集开创了x86处理器支持SIMD操作的先河。这个指令集定义了八个64位浮点寄存器,而奔腾MMX本身只是一个32位处理器。1999年推出的奔腾3处理器,同样只有32位,增加了SSE指令集,与8个128位寄存器相匹配。后来的AVX2和FMA指令集可以支持256位操作,浮点寄存器也扩展到256位。目前CPU中最大的是AVX-512指令集使用的512位寄存器。
CPU中有许多不同的寄存器。
CPU的地址总线位宽是什么鬼?
英特尔的解释是物理地址扩展(PAE)是一种允许32位处理器访问大于4gb的物理地址空间的功能。上图是英特尔至强处理器E5-2698 v3的截图,具体解释了物理地址的扩展。一般的想法是32位处理器可以使用4GB以上的内存。这个PAE是CPU的地址总线位宽。在8086中,16位CPU,其地址总线位宽为20位,可寻址1MB。在80286中,它的PAE是24位。在PentiumII(32位CPU)中,这个PAE变成了36位,可以支持64GB寻址。64位CPU出现后,其地址总线位宽一般为36位或40位,它们寻址的物理地址空为64GB或1T。
地址总线和数据总线是什么关系?可以理解为地址总线用于定位,数据总线用于传输,即CPU需要从内存中读取数据或向内存中写入数据时,用地址总线指定需要访问的内存块的物理地址,然后通过数据总线发送数据。
所以CPU的位宽与寻址能力无关。16位CPU的地址总线位宽可以是20位,32位CPU可以是36位,64位CPU可以是40位。所以下次一定不要说32位CPU只能寻址2 ^ 32(4GB),这就大错特错了。
32位系统只支持4GB内存?
理论上32位操作系统的逻辑地址寻址范围只有2 32 = 4GB,但实际情况并非如此。虽然常见的Windows 7 32位(真的有人用Windows 10 32位吗?)系统只能识别4GB内存,最大可用内存为3.25GB,但是,同样是32位的Windows Server 2003/2008可以使用4GB以上的内存,因为这些系统支持PAE物理地址扩展技术。
除了CPU支持,PAE还需要芯片组、主板和操作系统支持。比如Yiyouyou.com的一些老主板不支持大于4GB的物理内存,微软也没有对32位家用操作系统开放PAE功能。即使是Windows Server系统,如果不是企业版的话,也不开放PAE功能。
当然,Windows XP/7/8/10系统的内核本身就支持PAE功能。32位版本的系统可以通过破解支持4GB以上的内存来打开这个功能。破解方法其实不难。网上有很多现成的工具,但是真的,与其破解,不如直接安装64位操作系统。