我們有時候會遇到這樣一種情況:我們在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。
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位的程序 ,當然這個問題就沒有必要深究了。