(對x86處理器介紹得最詳盡又最具實踐指導意義的一本書)
鄧志著
ISBN 978-7-121-18176-4
2012年10月出版
定價:119.00元
16開
840頁
對x86處理器介紹得最詳盡又最具實踐指導意義的一本書
內容簡介
本書是對Intel手冊所述處理器架構的探索和論證。全書共五大部分,從多個方面對處理器架構相關的知識進行了梳理介紹。書中每個章節都有相應的測試實驗,所運行的實驗例子都可以在真實的機器上執行。
通過閱讀本書,讀者應能培養自己動手實驗的能力。如果再有一些OS方面的相關知識,基本上就可以寫出自己簡易的OS核心。
本書適合有一定的x86基礎知識,且對了解處理器架構及編程感興趣的讀者閱讀。
作者介紹
鄧志,1977年生於廣東,在銀行工作十餘年,現自由職業者。對計算機有一股熱情和蠻勁,善於思考,特別喜歡琢磨底層架構。熟悉C語言,並且精通x86/x64平台的彙編語言與機器指令系統,能用彙編寫簡易的OS核心。
名家推薦
·在學習x86彙編語言的過程中,總會遇到這樣一種情況:基礎的指令和架構已經學完,驅動或者套用也會開發了,但想要再進一步發掘處理器的新增指令集以及新特徵,卻發現參考資料只有Intel的指令手冊,每條指令寥寥數語的說明文字對於了解複雜的新特徵根本是杯水車薪。現在,本書以詳盡的示例帶領讀者探索這部分內容,全面深入地為讀者展現了x86處理器的高級特徵。
羅雲彬
暢銷書《琢石成器——Windows環境下32位彙編語言程式設計》作者
·這本書真正是讓我眼前一亮。到目前為止,這是我見過的對x86處理器介紹得最詳盡又最具實踐指導意義的書。我如果學習的話,一定會選擇這本書。很顯然,在實踐中解決困難,套用所學知識的樂趣,是任何高大全的課程所無法比擬的。如果耐心地將這本書上的內容讀過,將作者提供的例子一一運行過,我相信對x86處理器的知識,必定會瞭然於胸。
譚文
暢銷書《天書夜讀——從彙編語言到Windows 核心編程》
《寒江獨釣——Windows 核心安全編程》作者
序
我還記得我最初碰到鄧志,是因為我碰到需求不得不要寫一個比較簡單的x86指令的編碼器。其實我並不是要寫一個彙編器那么強大的工具,只是需要動態地生成一部分x86的指令來完成一些功能。我在網上找了很多代碼,包括下載了nasm的源碼,改了一段時間,因為牽涉太廣實在是無法精簡。沒辦法就只好自己學習x86的指令編碼規則。於是在志志的主頁上看到了他對x86指令編碼規則的簡單通俗的介紹。學了一下受益頗多,比看Intel提供的指令手冊要簡單多了,而且照樣好用。不過,可惜的是,現在我又忘得精光了。當然,如果我要再用,我會去找他的。現在可簡單多了,我會要他送一本他的新書給我。我想這本書應該很快就會和讀者們見面了,因為我已經在幫他寫序了。
從他網站上的文章來看,他是個基礎非常紮實的技術人。這點和我就不一樣了。我多年來一直疲於奔命地開發各種各樣的項目,做了無數種稀奇古怪的東西,但基本上都是做完即忘。下次碰到一樣的問題,唯一的記憶是知道應該去哪裡找線索。所以我在寫《天書夜讀》和《寒江獨釣》的時候,也只能一邊寫代碼一邊寫書。如果是代碼上沒有用到的地方,也就避而不談了。避不開的,我只能說,這個問題筆者沒有研究過,請讀者自己研究云云。當然這也招來了不少讀者的不滿。不過我總覺得,我作為一個工程師,只能寫出工程上遇到過和處理過的問題。否則就只能瞎編或者照搬了。但是志志的風格和我完全不一樣。我感覺他總是要親手編碼研究每個細節問題,而不在乎這個問題在實際項目中是否真會遇到。否則我無法理解他的作品為何會那么詳盡。
我曾經把《天書夜讀》第二版(這個版本至今還沒有出版)的一些章節發給他,讓他幫我給點意見。結果他自己“過濾”了每個字和每個標點符號,針對每個遣詞用句、技術細節給了無數的反饋意見,而且任何一個小問題都引經據典地同我辯駁,我往往無言以對。從此我只能叫他鄧學究。
我很高興為鄧學究的書寫序。他的書是學院派的,並非工程派的。學院派的好處是體系完整,事無巨細,盡情囊括。讀者盡可以從中學到全貌的知識,而不像每天只知道幹活的工程師寫出的經驗總結——那些經驗或許很有價值,能夠協助你快速入門,甚至完成一個項目的任務,但是夯實自己的技術基礎,那依然是自己不得不要去完成的任務。
我甚至覺得他這本書非常適合作為教材。一般的學院派的書理論居多,指導實踐的少。我在大學的時候就常常是覺得學過了大部頭的教材,還是完全不知道學到的東西如何使用。往往是幾個簡單的實驗做完就了事了。到了工作中早就忘記得一乾二淨。幸運的是鄧志的這本書完全不是如此。幾乎書中講到的每一步,他都介紹了在計算機上實際操作的方法。而所用的軟體工具,無一不詳盡提供其細節,真正達到了從零基礎開始動手,也不會存在任何障礙的程度。當然,學習這樣一本書,是需要極大努力和耐心的。如果我是教師,我甚至可能都不敢選擇這本書作為教材。因為我要花很多時間,才能去把上面的示例代碼一一跑通。而且還要時刻擔心在課堂上演示出問題,而又解決不了時滿頭大汗的尷尬呢。但要是學習的話,就一定會選擇這本書。很顯然,在實踐中解決困難,套用所學知識的樂趣,是任何高大全的課程所無法比擬的。如果耐心地將這本書上的內容讀過,將鄧學究提供的例子一一運行過,我相信自己對關於x86處理器的知識,必定會瞭然於胸了。
當然,有些讀者會覺得奇怪,為什麼要學習這本書呢?這本書有什麼價值呢?我覺得可以拿大學的一門課程來解釋這本書的價值,那就是“80x86微機原理與接口技術”。在我讀大學的時候,這門課程的內容就已經嚴重地過時了。此後工作許多年,我也沒有碰到過這門課程中有令我滿意的資料。有一些翻譯的書還算不錯,比如我後來用過的《Intel微處理器》,但是鄧志的這本書真正是讓我眼前一亮。目前為止,這是我見過的對x86處理器介紹得最詳盡又最具實踐指導意義的書。
譚文於2012年秋
前 言
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的區別進行了強調。
儘管我已竭力探索事物的本質真相,然而不可否認,本書中仍可能會有些個人主觀的認知因素,但必須說明的是,這些主觀的認知是經過客觀的實驗事實而得出的,本書的每個知識點都經過了實驗例子進行測試。在本書成書過程中,我慢慢地發現,如果沒有經過實驗的測試竟然覺得心裡不踏實,總覺得欠缺什麼而不敢下筆。本書中有上百個實驗,每個章節都有數個例子。然而比起我所做過的測試仍相距甚遠。
通過本書,我希望能引起讀者的共嗚,激發求知的欲望和探索的精神,以及學會怎樣“肓人摸象”。儘管摸到的可能只是事實的一部分,但是只要我們不斷地進行摸索,經過反覆的測試,我們終將會慢慢積累知識,在一無所知的情況下逐步接近真相。
本書特色
本書是對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架構進行描述。
讀者對象
如果你工作在x86與x64平台上;如果你對x86與x64架構知識有興趣;如果你正在學習x86與x64,或者有一定的基礎,想繼續擴展視野:我想本書是適合你閱讀的。
本書假設你有一定的x86基礎知識,包括:
1)有一些彙編語言的基礎,至少能看懂一些簡單的彙編代碼。
2)有一些x86架構知識,知道x86是什麼。譬如:知道什麼是實模式、保護模式等。
3)最好能有一些寫boot代碼的知識。即使沒有,你也可以參照書中的原始碼例子。
儘管書中例子是使用彙編語言編寫,但即便你的彙編語言基礎不那么好,閱讀起來也不會感到太困難,因為這些例子的代碼並不像從高級語言反彙編出來的代碼那樣涉及過多的程式結構知識,譬如:
1)你不會面對著stack的各種開棧銷棧處理,因為實驗例子中的過程調用基本上不會使用棧來傳遞參數。
2)你不會面對著各種複雜的程式分支結構和編程技巧,實驗例子都使用很純粹的彙編代碼編寫。
了解一下nasm
如果你對彙編語言掌握比較熟練,你可能需要去了解一下nasm彙編語法,因為本書的所有實驗例子都使用nasm編譯器編譯。別擔心,對一條彙編代碼,nasm的語法和Intel使用的語法是一樣的,但對於運算元定址到記憶體,則表達形式有一些差異。
nasm與Intel在記憶體運算元定址的表達上有一些區別,主要有以下兩方面。
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結束
選擇章節閱讀
如果想對x86與x64有較全面的了解,那么從第1章到第21章最好都去閱讀。對於x86與x64編程基礎不是那么好的讀者,第1章和第2章是必須要去了解的。
要想更好地了解x86與x64平台,第1篇、第2篇,以及第4篇是需要好好閱讀的,它們是x86與x64架構體系的基石。
第3篇與第5篇旨在幫助讀者擴展視野,它們是讓x86與x64平台變得強大的地方。
x86與x64的章節
在每一個章節里都會有x86與x64體系的相關描述,特別是在第2篇和第3篇。如非明確註明,x86下大多數的特徵在x64下也是適用的。譬如對MSR(Model-Specific Register)的訪問方式在64位執行環境下與x86體系下是一樣的;再譬如對local APIC的編程方式,在x64下與x86下也是一樣的;又譬如對x87 FPU與SSE指令的執行環境,大多數情況下在x64下與x86下是一樣的。
總之,除了第12章明確描述x64內容外,其他章節都會含有x86與x64的描述。
只要您有耐心,它們都是不二之選。
致謝
感謝電子工業出版社博文視點編輯及相關工作人員的辛勤勞動使本書得以出版,感謝譚文先生作序,感謝羅雲彬先生推薦。
鄧志
2012年8月