萬盛學電腦網

 萬盛學電腦網 >> 服務器教程 >> 操作系統與應用軟件中64位與32位的關系

操作系統與應用軟件中64位與32位的關系

  64位計算已經逐漸融入了我們的生活,MacOS、Linux和Windows Server系統中64位都已經成為主力,而64位的Windows客戶端也得到了很好的推廣。但是,64位卻然很多人“望而生畏”,因為大家都不熟悉 64位計算的特性,也擔心所謂的“兼容性”。其實沒有必要擔心這些,64位是一個兼容原有32位的擴展平台,下面將詳細的進行說明。

  歷史發展

  我們平常桌面電腦使用的所謂64位平台其實是 x86-64,也就是說在原有的 x86 平台上實現 64 位。什麼是 x86 平台呢,也就是 Intel 在 8086 之後一系列處理器中使用的架構,8086 是 16 位的,後來擴展到 32 位的 80386,之後一直沿用就形成最流行的的 32 位處理器系列,這種架構也叫做 IA32(Intel 實現32位),注意 AMD 也是使用 Intel 的技術。

  32 位 x86 處理器經過大力發展,性能已經比較強大,完全適合於桌面計算機和通用服務器,用戶和開發者數量龐大。但是 32 位 CPU 的內存尋址能力(可訪問 4G 內存)有限,於是 AMD 公司率先開發出了 x86-64(也稱為 AMD64)架構處理器,它完全可以實現 64 位計算。後來 Intel 自然不會示弱,也開發了EM64T(擴展內存 64 位技術),也就實現了和 AMD64 幾乎一樣的 IA32e(Intel 實現32位擴展)架構處理器。

  當前,主流的Intel/AMD處理器都是准64位處理器。

  但是要注意的是在 AMD64 誕生之前, Intel 和 HP 等公司合作開發了 IA64 (Intel 實現64位)架構,這個是一個全新的 64 位架構,不兼容原有的 32 位程序,只能通過模擬器模擬執行,而且效果完全不盡人意。不過這和我們現在討論的 64 位沒有關系,這大概就是誤解的來源之一。

  硬件實現

  那麼,64 位計算是如何實現的呢?首先要說明 x86-64 是站在 x86 的肩膀上的,並沒有另起爐灶,CPU 指令長度(即指令占有的二進制位數)不變,原有的指令集也一律保留,所以 x86 和 x86-64 總體的架構是一致的,指令完全兼容。改變的部分,原有通用寄存器容量均增長為 64 位,順便還加了 8 個,同時增加了 8 個 128 位的 XMM 寄存器,內部總線(即 CPU 部件間的數據通道)寬帶也增至 64 位或更多。當然還有增加用於支持這些寄存器的相關指令。由此可以看出,CPU 處理的數據均支持 64 位,內存編址理論上也可達到 2的64次方 個地址空間,但由於是在 x86 的架構上構建的 64 位計算,64 位線性尋址能力還不成熟,實際上的可編址並沒有這麼多,但可改進。

  之前也一再強調,x86-64 只不過是 x86 的擴展,因此現有的 64 位處理器可以同時運行 32 和 64 位程序。下面以 Intel 的技術(AMD 的原來其實一樣)為例說明。具體情況要分為下面幾類:

  1. 沒有激活 64 位(傳統模式/ IA32 模式)。也就是沒有為機器安裝 64 操作系統,只使用 32 位操作系統。這時 CPU 只會工作在純 32 位模式,第二節中提到的硬件和指令都被屏蔽掉了。

  (下面這些是涉及 32 位模式和兼容 16 位程序指令的,這裡就不再詳細說明了。)

  1.1. 實模式

  1.2. 虛擬 8086 模式

  1.3. 保護模式

  2. 已經激活 64 位。這時已經安裝 64 位操作系統,操作系統在啟動時就將 CPU 置為 64 位工作狀態。所有新寄存器、擴展寄存器和指令都被激活並可用。

  2.1. IA32e 模式/ EM64T 模式。這時正在運行 64 位程序,CPU 完全以 64 位特性工作。

  2.2. 兼容模式。這就是在 64 位系統下運行 32 位程序的模式了。具體的情況下面會詳細說明。

  軟件實現

  在兼容模式下,支持 x86-64 的 64 位操作系統就要起到協調作用了,它首先要是識別程序的平台性質,如 16 位(Windows x64 並不支持 16 位子系統,因此無法執行 MS-DOS 16 位程序)、32 位,還是 64 位。如果是 32 位,就在相應的程序指令前加上 32 位標志,CPU 遇到這個標志時,就不會把程序應用的 64 位新特性中,為程序指定 32 位寄存器(雖然部分 32 位寄存器是 64 位寄存器的前一部分,但它們名字是不相同),內存空間也重新映射或進行必要轉換(這還不太確定)。也就是說,32 位程序所看到的寄存器仍然是 32 位的,內存仍然只能訪問 4G 或以下,它們不會發現 CPU 有任何異常。

  對於操作系統的軟件部分,就拿 Windows x64 來說,我們可以發現,它比對應的 32 位系統要臃腫一些,部分原因是 64 位指令數據要長一些,單個程序會大一些。但更明顯的是操作系統中的很多東西都是“雙份”的,也就是分別准備了 64 位的和 32 位的,這些主要是平台資源(如 .NET 框架)、庫資源(如 Visual C++ 庫)和一些底層的系統工具(如 CMD、DXDiag)。更明顯的表現是,打開系統分區,我們就能發現程序文件夾“Program Files”有兩個,一個用於 x86-64 軟件,另一個則用於 x86(32位)軟件。這可說明,不僅硬件完全支持 x86/x86-64,操作系統也把這兩個平台放在平等的地位。

  隨著 64 位操作系統的推廣,越來越多的軟件開發者會同時在 32 位和 64 位環境下進行軟件測試,保證軟件的可靠性。但是要他們統統開發純 64 的版本是不現實的,雖然從 x86 過度到純 x86-64 理論上只要重新編譯,原來的代碼可以不作任何修改,但有時並不這麼簡單,同時還要考慮經濟效率(再次開發是要花錢的),再說一些軟件並不需要用的用到 64 位的計算特性(所以也沒有修改和重新編譯的必要)。所以就放心的用那些已經寫明支持 x86 64位平台的程序好了,就算沒有聲明支持 x86-64 也是可以運行的。

  兼容問題和解決方案

  對於任何一個新的操作系統,都會用不兼容的情況。如果遇到不兼容,應該先考慮是否是操作系統自身升級帶來的。舉個例子,對於一個為 Windows XP 開發的程序如果在 Windows 7 x86 上運行沒有問題,那在 Windows 7 x64 上運行應該也不會有問題。當然還是不推薦使用已經過時的程序。

  另一點需要注意的是,前面已經提到那些需要准備“雙份”中的 32 位的平台或庫資源是否安裝了,它們是支持開發軟件的基礎,32 位和 64 位必須一一對應。如果缺失了相應的 32 位版本,需要它支持的 32 位程序自然不能運行。解決方法就是使用程序的安裝向導重新安裝(而不是使用綠色安裝包),或者查找程序說明後再到微軟下載中心下載缺失的組件。

  推薦使用 64 位而不用 32 位的情況

  和硬件打交到的驅動程序,因為他們的底層工作特性,64 位是必不可少的。這就是為什麼 64 位操作系統推廣緩慢的原因,也是 64 位“兼容性差”的表現。還好當前硬件廠商都默認發布 Windows 64 位版本。

  除了驅動程序還有什麼軟件必須用 64 位的?這個並不好說,一般說來是那些需要頻繁處理大量數據或者需要占用很多內存空間(甚至會超出 4G 內存空間)的程序。比如:

  一些大型的開發平台或服務器平台,如 AutoCAD 、Photoshop 和 SQL Server 等;

  編/解碼器,如 PotPlayer 及對應解碼器,如果你要看一些質量很高的電影,用 64 位軟件渲染自然會流程一些;

  一些頻繁使用的工具,如果你要 Internet Explorer 一次同時打開十幾個頁面,或者要殺毒軟件監控全部文件和數據區,那還是用 64 位的吧。

  至於其他小巧的軟件,就沒必要這麼糾結了,如果有 64 位的就用,沒用就用 32 位的替代。不過說實話,我們都希望用 64 位,即使軟件性能沒有什麼改進,至少運行效率會高一些,還有“原生 64 位”聽起來很正統啊。不過要是“沒有”那也沒啥關系,我們還有“兼容模式”。

copyright © 萬盛學電腦網 all rights reserved