你的问题是针对特定的架构,x64基本上是x86架构的扩展。它支持64位地址空间。它提供了一些新的指令和新的寄存器。
你可以在x64机器上运行32位x86 Windows。注意,你不能在Itanium 64位系统上这样做。
目前公认的答案一般是正确的,但并不具体。真的没有一种东西叫做 “32位CPU "或”“64位CPU”–那只是一种描述,它只指CPU架构中的一小部分。特别是,它指的是CPU和内存之间的地址选择线的数量,也就是所谓的可用于内存操作的地址空间。
在以前CPU的时候,当人们坐下来在处理器和内存之间编织(缠绕)线的时候,你必须在CPU和内存控制器之间使用32根或者(理论上,因为当时还不存在)64根线,用来指定你想要访问的内存地址。比如说,我们有一个2位的内存架构:发送00会选择地址0,01会选择地址1,10会选择地址2,11会选择地址3。这2位给我们提供了2^2字节的RAM(4字节)。
如果你把一个32位的CPU,在CPU和内存控制器之间再加上32根线,这样你就神奇地能够支持更多的内存了,现在你就有了一个 “64位CPU",可以运行32位代码,也可以运行64位代码。这意味着什么,这是如何发生的?好吧,让我们把本答案前面部分的2位CPU再加一根线,把它变成一个3位CPU,使我们的内存从4字节变成2^3或8字节。
现有的 "2字节 "代码将运行,设置最后两根线的值,就像上面指出的那样(00-11)。我们会将额外的连接线默认为0,所以实际上当2字节代码运行时,当它选择00时,实际上是选择000,当它选择11时,实际上是选择011。很简单。
现在,一个程序员想写 "原生 "3字节的代码,并编写她的软件来利用额外的地址空间。她告诉CPU,她知道她在做什么,她将手动控制新的、额外的线。她的软件知道额外的线,并正确地发送了000-111,使她能够完全访问这个新的CPU架构所支持的内存范围。
但这不是必须发生的方式。事实上,这通常不是事情发生的方式。当64位CPU被首次引入时(有很多),它们都采用了全新的架构/设计。他们并不只是多加了32根线,然后说:"给你,这是一个64位的CPU,你可以在32位或64位模式下使用。"而是说:"这是我们的新CPU,它只需要用这种全新的机器语言进行编程,以这种全新的方式进行行为,解决了无数不同的问题,远比旧的x86/i386 32位CPU更优雅,而且它是一个原生的64位架构。祝你玩得开心。”
这就是英特尔Itanium的故事,现在著名的 “Itanic "就是因为它的沉沦。它本应预示着新的64位时代的到来,它是值得期待的。可变长度的指令,巨大的缓存,64位的地址空间,大量的寄存器,超级刺激,超级酷,而且超级难以说服大家重新编译或重写20年的传统代码。这时候AMD和英特尔还真的在竞争,AMD灵机一动,说:"让我们忘掉这些'解决世界上所有问题'的事情,只需要在i386上多加32根线,做一个32位兼容的64位CPU",x86_64 CPU架构就这样诞生了。
事实上,如果你看看各大操作系统(Linux、Windows、BSD等)的内核名称和源代码,你会发现它们到处都是AMD64 CPU和AMD64架构的引用。AMD想出了一个制胜的策略,让大家转战64位世界,同时保留对32位应用的兼容性,以一种32位操作系统可以在64位硬件上运行,甚至32位应用可以在64位硬件上运行64位操作系统的方式。英特尔早早地就跟进了他们的 "英特尔EM64T "架构(与AMD64基本相同),x86/x86_64胜出,而Itanic以及MIPS64、ALPHA64等其他架构在桌面/服务器市场上已经看不到了。
tl;dr amd64 aka x86/64 CPU被设计成同时兼容32位和64位的内核和代码,但大多数64位CPU显然不是以同样的方式向后兼容。一个32位的CPU最多可以访问4GiB的内存,而一个64位的CPU可以访问惊人的16个EiBs(16×1024^6字节,或者说是4GiB内存的4亿倍)。