x86編程
1. x86/x64體系探索及編程的本書特色
本書是對Intel手冊所描述的處理器架構進行探索和論證,每個章節都有相應的測試實驗,所運行的實驗例子可以在真實的機器上執行。部分實驗是不能在VMware虛擬機和bochs模擬器上進行的,必須要在真實機器上運行。例如:第3篇的絕大部分內容和第4篇的部分內容。
通過閱讀本書,大約能培養自己動手實驗的能力。由於本書的實例是在祼機(無OS環境)上運行,因此,如果能走完本書的例子,加上一些OS知識的處理,基本上就可以寫出自己簡易的OS核心。
關於x86與x64
本書的另一個特色是無縫地集成了對x86與x64體系的描述。因此,既適合於x86體系,也適合於x64體系。這是因為,x64是在x86的基礎上擴展而來的64位技術,x64體系有x86的全部內容,又增添了全新的long-mode工作模式與64位執行環境。
在現在的技術趨勢下,為什麼還要保留對x86體系的描述?一方面,這能滿足不同的讀者層;另一方面,也是最重要的原因:x64體系並不是一個全新的平台架構,而是基於x86架構擴展而來的。因此對x64的描述絕不能脫離x86架構,x64體系還保留著向下兼容的能力,在long-mode的64位執行環境里,許多情況下仍然可能使用常見的32位編程技術,這主要是因為,在64位執行環境里,盡管default address size(默認地址大小)是64位,然而絕大部分指令的default operand size(默認操作數大小)依然是32位。
從軟體編程的角度上看,Pointer(指針)值是屬於64位的(地址寬度為64位),但是integer與long仍屬於32位(默認的數據寬度為32位),除非明確數據使用64位的long long類型訪問,64位執行環境里指令使用REX prefix(REX擴展操作數前綴)來達到訪問64位的數據寬度。
當然,如果只把它看成一本描述x64體系的書籍,那也是沒問題的!即使是Intel官方的手冊里也是同時在對Intel64與IA-32架構進行描述。
2. x86/x64體系探索及編程的前言
2003年前後,我開始對x86平台的一些架構知識產生了濃厚的興趣,在業余時間斷斷續續地學習了AMD的System Programming手冊。後來,為了方便,索性挑了些感興趣的章節列印出來,偶爾拿出來翻翻。也曾通過寫一個OS來學習x64的體系知識,當然這個OS只是個試驗品。
在計劃好寫本書之後,我又好好地重讀了Intel的幾卷手冊,特別是Intel 64 and IA-32 Architectures Software Developer's Manual的Volume 3 System Programming Guide和Volume 1 Basic Architecture。
因此,本書所寫的內容是基於Intel處理器的,至於所測試機器的處理器則是Intel的Westmere微架構處理器(SandyBridge的上一代)。但是,如非明確註明,大部分內容對於AMD處理器也是適用的,有些地方甚至反復多次對Intel與AMD的區別進行了強調。
盡管我已竭力探索事物的本質真相,然而不可否認,本書中仍可能會有些個人主觀的認知因素,但必須說明的是,這些主觀的認知是經過客觀的實驗事實而得出的,本書的每個知識點都經過了實驗例子進行測試。在本書成書過程中,我慢慢地發現,如果沒有經過實驗的測試竟然覺得心裡不踏實,總覺得欠缺什麼而不敢下筆。本書中有上百個實驗,每個章節都有數個例子。然而比起我所做過的測試仍相距甚遠。
通過本書,我希望能引起讀者的共嗚,激發求知的慾望和探索的精神,以及學會怎樣「肓人摸象」。盡管摸到的可能只是事實的一部分,但是只要我們不斷地進行摸索,經過反復的測試,我們終將會慢慢積累知識,在一無所知的情況下逐步接近真相。