32位程序与64位程序

 

我们有时候会遇到这样一种情况:我们在32位操作系统上下载了64位版本的程序,却发现无法安装,大家可能会很困惑。

下面就来简单解释一下32位程序与64位程序的具体区别。

 

我们首先要弄明白的:

1.这里所说的的32位与64位程序,是指经过编译后的可执行文件,例如像Windows上的exe文件,而最初编写的源码并没有32位和64位之说。

2.不是所有的程序需要区分32位和64位,对于原生语言例如C语言编写的程序需要区分64位与32位,但是对于像Java这样的语言,就不需要这样了,因为Java编写的程序是在JVM(Java虚拟机)上运行的,JVM屏蔽了具体的硬件细节。

3.32位与64位的程序的本质区别在于:两者最终在处理器上运行的指令是不一样的。

 

由于两者本质的区别在于处理器执行指令是不一样的,因此我们从CPU开始说起。

1.64位CPU与32位CPU

这两者的指令集合、操作数位数、寄存器名称和个数等等都不相同。

一、比如一条mov eax,1指令,可能在32bCPU上对应的机器指令是0x1201;在64位机器上就是0x123401。
二、64位CPU里的寄存器是64位的,这样CPU每次处理的数据量也就更大,32位CPU寄存器是32位的。
三、64位CPU里的寄存器数量也多于32位CPU。
四、32位CPU的地址总线不一定是32位的,还有可能是48位的,同样64位的CPU地址总线也不一定是64位,往往都是48位。
五、现在对于主流的处理器,64位的CPU是能够兼容32位指令架构的!!!!!!
 
从上面可以看到64位CPU的运算能力理论上比32位CPU强很多。
现在32位的CPU一般是X86架构的,从80386开始就是32位的CPU,也对应他的32位指令集。
后来发展出64位CPU,从X86扩展出64位的指令集,一般我们就叫做X64,也叫AMD64架构,因为最早是AMD推出64位CPU的。
 
 
2.32位的操作系统与64位的操作系统
32位的操作系统是专门为32位CPU设计的,同样64位的操作系统是为64位的CPU设计的。
前面也说了,64位的CPU能够兼容32位指令架构,因此在64位CPU上也可以安装32位操作系统。
 
32位的win7可以支持4G的逻辑地址空间,但其中用户能够分到的只有大约是3G多,还有一部分是分给系统内核了,64位的win系统,理论上寻址范围能够达到264。在这里多说一句,操作系统负责逻辑地址到物理地址的映射,因此32位的操作系统只能利用最大4G的物理内存,注意点大家需要注意。
 
 
3.32位应用程序与64位的应用程序
32位的程序就是将源码用32位的编译器编译的,64位的程序就是将源码用64位的编译器编译的。
 
应用程序只接触逻辑地址,并不接触真实的物理地址。
32位的程序理论上可以申请利用4GB的地址空间,64位的程序则可以申请利用大于4GB 的地址空间,这也是64位程序的一个巨大优势。
 
我们知道应用程序的运行是需要操作系统作为支撑的,这些程序在运行时常常需要进行一些系统调用,还有各种库函数等。
这些可执行文件能否顺利运行有着两个最重要的地方。
1)动态链接库。
2)系统API。
 
对于Windows系统而言,64位的系统往往具有32位系统的库,因此在64位系统上能够运行32位的程序,但是反过来就不行了,因为32位系统一般没有64位系统的库。
 
32位升级到64位不是简单的重新编译发布一下就可以了。举个例子,在32位C语言环境里一个指针可以放入一个int型的变量中,但在64位里就不行了了,因为64位程序里的指针为64位,这样的话程序肯定就爆了,因此对于某些程序如果想要升级到64位,则需要修改源码,这个工作是相当繁琐的。
 
总结

1.32位CPU只能安装32位的操作系统,而32位操作系统只能运行32位的程序。

2.64位CPU可以运行32位或者64位的操作系统,64位操作系统可以运行32位或64位程序。

3.64位版本的程序占用的内存空间更大,因为它的指针是64位的,但同时它又可以申请更多的逻辑地址空间。

4.大家可能会疑问,第一个64位的程序是怎么来的,因为那个时候还没有64位的编译器,其实很简单,32位的编译器也可以编译出64位的程序 ,当然这个问题就没有必要深究了。

原文地址:https://www.cnblogs.com/mlgjb/p/8385658.html