Wow!什麼是Wow64

今天有個同事,被SysWow64搞暈了。這裏簡單介紹一下。

64位的Windows並不是簡單地把所有東西都編譯成64位就萬事大吉的。關於64位的CPU應該做成什麼樣子,Intel和AMD曾有各自的打算。AMD的回答直接了當:新的64位處理器,應該能在提高更高處理能力的同時,保持對32位元應用程式的相容性。而Intel則希望借此機會,把下一代的處理器,設計得更完美。於是,就有了AMD的x86-64(後被稱為amd64)的處理器和Intel的IA-64(安騰)處理器。和amd64不一樣的是,安騰處理器並沒有很好地提供對32位元應用程式的支援。具體資訊,讀者在網上應該很容易找到,也就不多說了。

Windows作為一個作業系統,自然希望用戶在運行64位元作業系統時,也能像以前一樣,運行各種32位元應用程式。這一點,在amd64處理器上,相對容易做到。而安騰,幾乎是另外一回事。(後來Intel也生產了相容amd64的處理器,但那是後話。)

雖然我說“相對”容易做到,但也不是空手套白狼。當作業系統運行在64位元時,怎麼才能保證已經存在的32位元應用程式以為自己仍然運行在32位元系統上呢?微軟的解決方案是:Wow64,全稱是32bit Windows On 64bit Windows(64位Windows上的32位Windows)。

你也可以這樣理解,雖然整個系統是運行在64位元模式,但如果一個應該程式是32位元的,Windows會在64位的基礎上,載入一個“32位的Windows”。這樣,這個32位元應用程式就以為自己是運行在32位元的系統之上的。

於是,你也可以想像,這就意味著,64位的Windows,不但帶有64位元作業系統應有的系統檔,還帶有32位元系統應有的系統檔。

我們都知道的是,Windows系統的主要系統檔都是放在一個叫做System32的檔夾中的。為了能同時放下兩套系統檔,Windows會在64位元的系統上,增加了一個檔夾,叫SysWow64。

這便有了一個問題,System32和SysWow64裏面,哪個放的是64位元的系統檔,哪個放的是32位元的系統檔呢?

如果你還記得Wow64指的是64位Windows上的32位Windows,那麼,你就能會想到,SysWow64裏放的是32位元的系統檔。但你也可能會問,為什麼一個明明叫System32的檔夾裝的是64位元的系統檔,而一個明明叫SysWow64的檔夾裝的卻是32位元的系統檔呢?既然是64位元的系統,為什麼不能有System64和System32這樣的檔夾呢?

這個問題問得很好。答案也很簡單:人在江湖,身不由己。

相容性

如果我問你,可曾有多少機會接觸過安騰處理器呢?我想,對於一般人來講,應該是沒有的。那為什麼amd64會大行其道,而安騰處理器卻鮮為人知呢?還是因為一個軟硬體設計上的關鍵概念:相容性。

正是因為安騰處理器,沒有做好對已有的32位元系統提供良好的支援,便其一直處於市場的邊緣。這和你不會買一台看不了類比信號頻道的高清電視是一個道理。

之前我們談到的相容性,是指在64位Windows上,相容已經有的32位元應用程式。現在考慮另一種相容性。

如果你寫了一個很牛的32位元的應用程式,現在,你想把它變成64位元的應用程式,以更充分地利用64位處理器所帶來的新的處理能力。你肯定覺得,這不就是讓64位編譯器編譯一遍就完了的事兒麼?可能你發現,這並不是骨感的現實。你突然發現,你的程式裏,為了某些你已經想不起來的原因,把System32這個檔夾,寫死在了你的程式裏。而這個System32中的32,讓你很不安。你嘗試著運行了你的程式,卻發現一切正常。為什麼呢?因為這是Windows系統的另一個相容性方面的努力:讓一個已有的32位元應用程式,不加修改或者盡可能少地加以修改,便可以被編譯成64位元應用程式並在64位元Windows上運行。其實,把System32這樣的路徑,寫死在程式裏,並不是一個個案。所以,為了保證這些應用程式可以順利地過渡到64位,Windows最後還是決定讓64位元的系統檔放在System32的檔夾下。而讓32位元的系統檔,搬到了SysWow64中去。

你肯定會想,那讓32位搬到SysWow64中去以後,那些寫死在32位元應用程式中的System32怎麼辦?答:Windows會給他們轉向到SysWow64中去。那讓64位中的System32轉向到System64不也是一樣麼?真的一樣麼?不一樣麼?真的一樣麼?不一樣麼?真的不一樣。

作為64位元Windows作業系統,當然是希望能充分發揮64位處理器的潛力,讓應用程式更有效率地運行。如果在運行64位元應用程式時,總要檢查是否需要轉向,勢必影響程式運行效率。所以,不能給64位元應用程式做沒有必要的轉向,如果說必須要轉,那就只能轉32位元應用程式了。是的,沒有辦法,在64位元作業系統中,32位元應用程式要做一些小的犧牲。

此外,為了保證32位元應用程式不與64位元應用程式相衝突,除了System32檔夾外,註冊表也需要為32位元和64位提供兩套,也需要讓32位元的應用程式在必要時重定向。

結論

所以SysWow64檔夾,是64位Windows,用來存放32位元Windows系統檔的地方。

後記

相容性是一個重要的事情。當然,也是一個很有意思的事情。如果你在Windows 7中運行"winver",你就會發現,Windows 7原來是Windows 6.1。為什麼呢?事情是這樣的,Windows XP是Windows 5.2,Windows Vista開始變成了6.0,結果,很多應用程式只是檢查作業系統版本號的頭一位,發現不是5,於是就提示用戶說:“我們不支援Windows XP以前的系統”。這也是從Windows Vista的不成功中,學習到的一課。也許,以後永遠都沒有Windows 7.0也未可知啊。

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 Auster 的頭像
    Auster

    Auster 隨手亂彈

    Auster 發表在 痞客邦 留言(1) 人氣()