- x86/x64體系探索及編程
- 鄧志著
- 2809字
- 2019-03-01 11:49:25
前言
2003年前后,我開始對x86平臺的一些架構知識產生了濃厚的興趣,在業(yè)余時間斷斷續(xù)續(xù)地學習了AMD的System Programming手冊。后來,為了方便,索性挑了些感興趣的章節(jié)打印出來,偶爾拿出來翻翻。也曾通過寫一個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的區(qū)別進行了強調。
盡管我已竭力探索事物的本質真相,然而不可否認,本書中仍可能會有些個人主觀的認知因素,但必須說明的是,這些主觀的認知是經過客觀的實驗事實而得出的,本書的每個知識點都經過了實驗例子進行測試。在本書成書過程中,我慢慢地發(fā)現,如果沒有經過實驗的測試竟然覺得心里不踏實,總覺得欠缺什么而不敢下筆。本書中有上百個實驗,每個章節(jié)都有數個例子。然而比起我所做過的測試仍相距甚遠。
通過本書,我希望能引起讀者的共嗚,激發(fā)求知的欲望和探索的精神,以及學會怎樣“肓人摸象”。盡管摸到的可能只是事實的一部分,但是只要我們不斷地進行摸索,經過反復的測試,我們終將會慢慢積累知識,在一無所知的情況下逐步接近真相。
本書特色
本書是對Intel手冊所描述的處理器架構進行探索和論證,每個章節(jié)都有相應的測試實驗,所運行的實驗例子可以在真實的機器上執(zhí)行。部分實驗是不能在VMware虛擬機和bochs模擬器上進行的,必須要在真實機器上運行。例如:第3篇的絕大部分內容和第4篇的部分內容。
通過閱讀本書,大約能培養(yǎng)自己動手實驗的能力。由于本書的實例是在祼機(無OS環(huán)境)上運行,因此,如果能走完本書的例子,加上一些OS知識的處理,基本上就可以寫出自己簡易的OS核心。
關于x86與x64
本書的另一個特色是無縫地集成了對x86與x64體系的描述。因此,既適合于x86體系,也適合于x64體系。這是因為,x64是在x86的基礎上擴展而來的64位技術,x64體系有x86的全部內容,又增添了全新的long-mode工作模式與64位執(zhí)行環(huán)境。
在現在的技術趨勢下,為什么還要保留對x86體系的描述?一方面,這能滿足不同的讀者層;另一方面,也是最重要的原因:x64體系并不是一個全新的平臺架構,而是基于x86架構擴展而來的。因此對x64的描述絕不能脫離x86架構,x64體系還保留著向下兼容的能力,在long-mode的64位執(zhí)行環(huán)境里,許多情況下仍然可能使用常見的32位編程技術,這主要是因為,在64位執(zhí)行環(huán)境里,盡管default address size(默認地址大?。┦?span id="4so604p" class="bold">64位,然而絕大部分指令的default operand size(默認操作數大小)依然是32位。
從軟件編程的角度上看,Pointer(指針)值是屬于64位的(地址寬度為64位),但是integer與long仍屬于32位(默認的數據寬度為32位),除非明確數據使用64位的long long類型訪問,64位執(zhí)行環(huán)境里指令使用REX prefix(REX擴展操作數前綴)來達到訪問64位的數據寬度。
當然,如果只把它看成一本描述x64體系的書籍,那也是沒問題的!即使是Intel官方的手冊里也是同時在對Intel64與IA-32架構進行描述。
本書內容
本書共分為五大篇。
續(xù)表
續(xù)表
讀者對象
如果你工作在x86與x64平臺上;如果你對x86與x64架構知識有興趣;如果你正在學習x86與x64,或者有一定的基礎,想繼續(xù)擴展視野:我想本書是適合你閱讀的。
本書假設你有一定的x86基礎知識,包括:
1)有一些匯編語言的基礎,至少能看懂一些簡單的匯編代碼。
2)有一些x86架構知識,知道x86是什么。譬如:知道什么是實模式、保護模式等。
3)最好能有一些寫boot代碼的知識。即使沒有,你也可以參照書中的源代碼例子。
盡管書中例子是使用匯編語言編寫,但即便你的匯編語言基礎不那么好,閱讀起來也不會感到太困難,因為這些例子的代碼并不像從高級語言反匯編出來的代碼那樣涉及過多的程序結構知識,譬如:
1)你不會面對著stack的各種開棧銷棧處理,因為實驗例子中的過程調用基本上不會使用棧來傳遞參數。
2)你不會面對著各種復雜的程序分支結構和編程技巧,實驗例子都使用很純粹的匯編代碼編寫。
了解一下nasm
如果你對匯編語言掌握比較熟練,你可能需要去了解一下nasm匯編語法,因為本書的所有實驗例子都使用nasm編譯器編譯。別擔心,對一條匯編代碼,nasm的語法和Intel使用的語法是一樣的,但對于操作數尋址到內存,則表達形式有一些差異。你可以從http://www.nasm.us/xdoc/2.10.03/html/nasmdoc0.html這個在線文檔了解nasm簡單的語法。
nasm與Intel在內存操作數尋址的表達上有一些區(qū)別,主要有以下兩方面。
1)operand size(操作數尺寸)的指示字。
2)segment override prefix(段改寫前綴)的位置。
在Intel語法上:
mov dword ptr [eax],1 ; 操作數尺寸使用dword ptr指示字 mov eax,cs:[20100h] ; 段前綴放在[]括號外
而在nasm語法上則需要變通一下:
mov dword [eax],1 ; 操作數尺寸指示字去掉ptr字 mov eax,[cs:20100h] ; 段前綴放在[]括號內
另外,例子中也有使用宏定義,因此也需要注意一下nasm中宏的定義方式,如下所示:
%macro NMI_DISABLE 0 ; 由 %macro 開始,參數個數為 0...... %endmacro ; 由 %endmacro結束
選擇章節(jié)閱讀
如果想對x86與x64有較全面的了解,那么從第1章到第21章最好都去閱讀。對于x86與x64編程基礎不是那么好的讀者,第1章和第2章是必須要去了解的。
要想更好地了解x86與x64平臺,第1篇、第2篇,以及第4篇是需要好好閱讀的,它們是x86與x64架構體系的基石。
第3篇與第5篇旨在幫助讀者擴展視野,它們是讓x86與x64平臺變得強大的地方。
x86與x64的章節(jié)
在每一個章節(jié)里都會有x86與x64體系的相關描述,特別是在第2篇和第3篇。如非明確注明,x86下大多數的特征在x64下也是適用的。譬如對MSR(Model-Specific Register)的訪問方式在64位執(zhí)行環(huán)境下與x86體系下是一樣的;再譬如對local APIC的編程方式,在x64下與x86下也是一樣的;又譬如對x87 FPU與SSE指令的執(zhí)行環(huán)境,大多數情況下在x64下與x86下是一樣的。
總之,除了第12章明確描述x64內容外,其他章節(jié)都會含有x86與x64的描述。
書中的例子與工具
本書共21章,每一章對應一個topicXX目錄,實驗例子源代碼就在這些目錄下以ex開頭的子目錄里,有上百個實驗例子。書中示例可在http://www.broadview.com.cn/18176下載,也可以在www.mouseos.com/books/x86-64/index.html下載。
下載解壓后即可在\source目錄下看到前面所說的目錄結構和實驗源代碼,還可以看到每個實驗生成的軟盤映像文件(demo.img)及硬盤映像文件(c.img),其中的硬盤映像文件可以直接寫入到U盤,放在真實機器上進行測試。
此外,在\tools目錄下還包括了我寫的merge工具及其源代碼和開源的dd工具。merge工具是一個合并模塊寫入映像文件以及U盤的工具。由于所附merge工具是在Windows 7下編譯的,如果在您的平臺下不能使用,您可以使用Visual Studio重新編譯生成。
dd工具也可以用來寫入U盤,但我很少使用它,不過我們可以用它來查看U盤設備在Windows上的符號鏈接名字,例如:\\.\g:就是在我的機器上的U盤符號鏈接名,在您的機器上應該是不同的名字。
參考資料
Intel的Intel?64 and IA-32 Architectures Software Developer's Manual,即Intel64和IA-32架構軟件開發(fā)者參考手冊,共有三卷,可從Intel官方網站免費下載:http://www.intel.hk/content/www/xa/en/processors/architectures-software-developer-manuals.html。
AMD的AMD64 Architecture Programmer's Manual,即AMD64架構編程手冊,共有五卷,可從其官方網站免費下載:http://developer.amd.com/documentation/Pages/default.aspx。
只要您有耐心,它們都是不二之選。
致謝
感謝電子工業(yè)出版社博文視點編輯及相關工作人員的辛勤勞動使本書得以出版,感謝譚文先生作序,感謝羅云彬先生推薦。
鄧志
2012年8月
- 集成架構中型系統(tǒng)
- 機器學習實戰(zhàn):基于Sophon平臺的機器學習理論與實踐
- 基于LPC3250的嵌入式Linux系統(tǒng)開發(fā)
- Getting Started with Containerization
- 數據庫原理與應用技術
- Photoshop CS3圖層、通道、蒙版深度剖析寶典
- Learning C for Arduino
- Mastering ServiceNow Scripting
- 基于ARM9的小型機器人制作
- Artificial Intelligence By Example
- Wireshark Revealed:Essential Skills for IT Professionals
- 傳感器應用技術
- 軟件需求最佳實踐
- 站酷志:資深設計師的Photoshop創(chuàng)意課
- 信息技術基礎與應用