內容簡介
《x86/x64體係探索及編程》是對Intel手冊所述處理器架構的探索和論證。全書共五大部分,從多個方麵對處理器架構相關的知識進行瞭梳理介紹。書中每個章節都有相應的測試實驗,所運行的實驗例子都可以在真實的機器上執行。
通過閱讀《x86/x64體係探索及編程》,讀者應能培養自己動手實驗的能力。如果再有一些OS方麵的相關知識,基本上就可以寫齣自己簡易的OS核心。
作者簡介
鄧誌,1977年生於廣東,在銀行工作十餘年,現自由職業者。對計算機有一股熱情和蠻勁,善於思考,特彆喜歡琢磨底層架構。熟悉C語言,並且精通x86/x64平颱的匯編語言與機器指令係統,能用匯編寫簡易的OS核心。
精彩書評
★在學習x86匯編語言的過程中,總會遇到這樣一種情況:基礎的指令和架構已經學完,驅動或者應用也會開發瞭,但想要再進一步發掘處理器的新增指令集以及新特徵,卻發現參考資料隻有Intel的指令手冊,每條指令寥寥數語的說明文字對於瞭解復雜的新特徵根本是杯水車薪。現在,本書以詳盡的示例帶領讀者探索這部分內容,全麵深入地為讀者展現瞭x86處理器的高級特徵。
——羅雲彬 暢銷書《琢石成器——Windows環境下32位匯編語言程序設計》作者 ★這本書真正是讓我眼前一亮。到目前為止,這是我見過的對x86處理器介紹得最詳盡又最具實踐指導意義的書。我如果學習的話,一定會選擇這本書。很顯然,在實踐中解決睏難,應用所學知識的樂趣,是任何高大全的課程所無法比擬的。如果耐心地將這本書上的內容讀過,將作者提供的例子一一運行過,我相信對x86處理器的知識,必定會瞭然於胸。
—
—譚文 暢銷書《天書夜讀——從匯編語言到 Windows 內核編程》 《寒江獨釣——Windows 內核安全編程》作者 目錄
第一篇 x86基礎
第1章 數與數據類型
1.1 數
1.1.1 數字
1.1.2 二進製數
1.1.3 二進製數的排列
1.1.4 十六進製數
1.1.5 八進製數與十進製數
1.2 數據類型
1.2.1 integer數
1.2.2 floating-point數 9
1.2.3 real number(實數)與NaN(not a number)
1.2.4 unsupported編碼值
1.2.5 浮點數精度的轉換
1.2.6 浮點數的溢齣
1.2.7 BCD碼
1.2.8 SIMD數據 21
第2章 x86/x64編程基礎
2.1 選擇編譯器
2.2 機器語言
2.3 Hello world
2.3.1 使用寄存器傳遞參數
2.3.2 調用過程
2.3.3 定義變量
2.4 16位編程、32位編程,以及64位編程
2.4.1 通用寄存器
2.4.2 操作數大小
2.4.3 64位模式下的內存地址
2.4.4 內存尋址模式
2.4.5 內存尋址範圍
2.4.6 使用的指令限製
2.5 編程基礎
2.5.1 操作數尋址
2.5.2 傳送數據指令
2.5.3 位操作指令
2.5.4 算術指令
2.5.5 CALL與RET指令
2.5.6 跳轉指令
2.6 編輯與編譯、運行
第3章 編寫本書的實驗例子
3.1 實驗的運行環境
3.2 生成空白的映像文件
3.2.1 使用nasm編譯器生成
3.2.2 使用bximage工具
3.3 設置bochs配置文件
3.4 源代碼的基本結構
3.5 編譯源代碼
3.6 映像文件內的組織
3.7 使用merge工具
3.7.1 merge的配置文件
3.7.2 執行merge命令
3.8 使用U盤啓動真實機器
3.8.1 使用merge工具寫U盤
3.8.2 使用hex編輯軟件寫U盤
3.9 編寫boot代碼
3.9.1 LBA轉換為CHS
3.9.2 測試是否支持int 13h擴展功能
3.9.3 使用int 13h擴展讀磁盤
3.9.4 最後看看load_module()
3.1 總結
第4章 處理器的身份
4.1 測試是否支持CPUID指令 67
4.2 CPUID指令的術語及錶達
4.3 基本信息與擴展信息
4.4 處理器的型號(family,model與stepping)
4.5 最大的物理地址和綫性地址
4.6 處理器擴展狀態信息
4.6.1 探測Processor Extended State子葉 75
4.6.2 Processor Extended State子葉所需內存size
4.6.3 Processor Extended State的保存
4.6.4 Processor Extended State的恢復
4.7 處理器的特性
4.8 處理器的Cache與TLB信息
4.9 MONITOR/MWAIT信息
4.1 處理器的long mode
第5章 瞭解Flags
5.1 Eflags中的狀態標誌位
5.1.1 signed數的運算 86
5.1.2 unsigned數的運算
5.2 IOPL標誌位 90
5.3 TF標誌與RF標誌
5.4 NT標誌 95
5.5 AC標誌 96
5.6 VM標誌
5.7 eflags寄存器的其他事項
第6章 處理器的控製寄存器
6.1 CR8
6.2 CR3
6.3 CR0
6.3.1 保護模式位PE
6.3.2 x87 FPU單元的執行環境
6.3.3 CR0.PG控製位 108
6.3.4 CR0.CD與CR0.NW控製位
6.3.5 CR0.WP控製位 110
6.3.6 CR0.AM控製位
6.4 CR4
6.4.1 CR4.TSD與CR4.PCE控製位
6.4.2 CR4.DE與CR4.MCD控製位
6.4.3 CR4.OSFXSR控製位
6.4.4 CR4.VMXE與CR4.SMXE控製位
6.4.5 CR4.PCIDE與CR4.SMEP控製位
6.4.6 CR4.OSXSAVE控製位
6.4.7 CR4中關於頁的控製位
6.5 EFER擴展功能寄存器
第7章 MSR
7.1 MSR的使用
7.2 MTRR
7.2.1 Fixed-range區域的映射
7.2.2 MTRR的功能寄存器
7.3 MSR中對特殊指令的支持
7.3.1 支持sysenter/sysexit指令的MSR
7.3.2 支持syscall/sysret指令的MSR
7.3.3 支持swapgs指令的MSR 127
7.3.4 支持monitor/mwait指令的MSR
7.4 提供processor feature管理
7.5 其他未列齣來的MSR
7.6 關於MSR一些後續說明
第二篇 處理器的工作模式
第8章 實地址模式
8.1 真實的地址
8.2 real mode的編址
8.3 real mode的狀態
8.4 段基址的計算
8.5 第1條執行的指令
8.6 實模式下的執行環境
8.7 實模式下的IVT
8.8 突破64K段限
8.9 A20地址綫
第9章 SMM係統管理模式探索
9.1 進入SMM
9.2 SMM的運行環境 141
9.2.1 SMRAM區域
9.2.2 SMM執行環境的初始化
9.2.3 SMM下的operand與address
9.2.4 SMM下的CS與EIP
9.2.5 SMM下的SS與ESP
9.3 SMM裏的中斷
9.4 SMI的Back-to-Back響應
9.5 SMM裏開啓保護模式 147
9.6 SMM的版本 148
9.7 I/O指令的重啓及Halt重啓
9.8 SMM的退齣 152
9.9 SMBASE的重定位
9.1 SMI處理程序的初始化
9.11 SMM的安全
9.11.1 芯片組的控製
9.11.2 處理器對SMRAM空間的限製
9.11.3 cache的限製
9.12 測試SMI處理程序
第10章 x86/x64保護模式體係(上)
10.1 x86/x64的權限
10.2 保護模式下的環境
10.2.1 段式管理所使用的資源
10.2.2 paging分頁機製所使用的資源
10.3 物理地址的産生 166
10.4 段式管理機製
10.4.1 段式內存管理
10.4.2 段式的保護措施
10.5 段式管理的數據結構 169
10.5.1 Segment Selector(段選擇子)
10.5.2 Descriptor Table(描述符錶)
10.5.3 Segment Selector Register(段寄存器)
10.5.4 Segment Descriptor(段描述符)
10.5.5 LDT描述符與LDT 258
10.6 開啓保護模式
10.6.1 初始化GDT
10.6.2 初始化IDT
10.6.3 切換到保護模式
第11章 x86/x64保護模式體係(下)
11.1 物理頁麵
11.1.1 處理器的最高物理地址(MAXPHYADDR)
11.1.2 物理頁麵的大小
11.1.3 頁轉換模式(Paging Mode) 268
11.2 paging機製下使用的資源 270
11.2.1 寄存器
11.2.2 CPUID查詢leaf
11.2.3 寄存器的控製位
11.2.4 頁轉換錶資源
11.3 32位paging模式(non-PAE模式)
11.3.1 CR3結構
11.3.2 32位paging模式下的PDE結構
11.3.3 使用32位paging
11.4 PAE paging模式 282
11.4.1 在Intel64下的CR3與PDPTE寄存器
11.4.2 在AMD64下的CR3
11.4.3 PAE paging模式裏的PDPTE結構
11.4.4 PAE paging模式裏的PDE結構
11.4.5 PAE paging模式裏的PTE結構
11.4.6 使用和測試PAE paging模式 288
11.4.7 使用和測試Execution Disable功能
11.5 IA-32e paging模式
11.5.1 IA-32e paging模式下的CR3
11.5.2 IA-32e paging模式下的PML4E結構
11.5.3 IA-32e paging模式下的PDPTE結構
11.5.4 IA-32e paging模式下的PDE結構
11.5.5 IA-32e paging模式下的PTE
精彩書摘
如果想對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的描述。
書中的例子與工具
本書共21章,每一章對應一個topicXX目錄,實驗例子源代碼就在這些目錄下以ex開頭的子目錄裏,有上百個實驗例子。
……
前言/序言
《代碼的深度:不止於 x86/x64 的係統之旅》 一、 撥開迷霧,揭示計算機世界的底層邏輯 你是否曾好奇,看似瞬息萬變的數字世界,其背後究竟由何支撐?當我們輸入一行行代碼,敲下迴車,它如何被理解、執行,最終呈現在我們眼前?《代碼的深度:不止於 x86/x64 的係統之旅》將帶你踏上一段前所未有的探索之旅,深入計算機的靈魂深處,揭示那些隱藏在高級語言錶象之下的底層奧秘。 本書並非一本簡單的技術手冊,而是一場關於“理解”的啓迪。它不局限於特定的硬件架構,而是以一種更宏觀、更具普適性的視角,引導讀者構建起對計算機係統運行機製的深刻認知。我們將從最基礎的概念齣發,層層遞進,如同剝洋蔥一般,一層一層地揭開計算機世界的神秘麵紗。 1. 架構的基石:指令集與微架構的對話 在探討任何更高級的概念之前,理解處理器如何“思考”是至關重要的。本書將詳細闡述指令集的本質,那是CPU與軟件之間的通用語言。我們將深入探討不同指令集的設計哲學,例如RISC (精簡指令集) 和CISC (復雜指令集) 的演變,分析它們各自的優劣,以及它們如何在硬件層麵影響程序的執行效率。 更進一步,我們將觸及微架構的奇妙世界。CPU內部不僅僅是執行指令的簡單機器,它是一個高度復雜的精巧設計。流水綫技術如何實現指令的並發執行?分支預測如何提升效率,又隱藏著怎樣的風險?緩存機製的層次結構如何加速數據訪問,其背後的原理又是怎樣的?本書將用通俗易懂的語言,結閤生動的圖示,深入淺齣地解析這些現代CPU設計中的核心要素。雖然我們不深入 x86/x64 的具體指令和內部設計,但我們將為你構建理解任何處理器微架構的通用思維模型。 2. 內存的脈絡:從地址空間到虛擬世界的幻象 程序運行時,需要大量的空間來存儲數據和指令,這便是內存。本書將帶你理解內存的層次結構,從寄存器到CPU緩存,再到主內存(RAM),以及它們之間的數據流動規則。我們將探討內存地址的概念,以及程序如何通過地址來訪問特定的數據。 然而,現代操作係統為我們構建瞭一個更為復雜的內存管理體係——虛擬內存。本書將深入剖析虛擬內存的運行機製。頁錶是如何將虛擬地址映射到物理地址的?缺頁中斷是如何發生的,又如何被處理?內存分頁和分段的機製如何帶來更大的靈活性和安全性?理解虛擬內存,你將明白為什麼不同進程可以擁有獨立的地址空間,以及操作係統如何高效地利用有限的物理內存。 3. 進程的生命:從啓動到調度的動態演變 當我們在操作係統中啓動一個程序,它便成為瞭一個“進程”。本書將詳盡地闡述進程的生命周期,從創建、運行、阻塞到終止的每一個階段。我們將深入理解進程的本質,它不僅僅是程序的代碼,更是一個獨立的執行實體,擁有自己的虛擬地址空間、資源和執行狀態。 操作係統的核心任務之一便是進程調度,如何公平有效地分配CPU時間給眾多進程?本書將介紹各種經典的進程調度算法,如先來先服務、短作業優先、時間片輪轉等,並分析它們的優缺點。你將瞭解到,正是這些精妙的調度策略,纔使得我們能夠流暢地同時運行多個應用程序,體驗到多任務處理的便利。 4. 綫程的並行:輕量級執行的奧秘 在進程內部,我們還可以進一步劃分齣更小的執行單元——綫程。本書將詳細解釋綫程的概念,以及它與進程在資源占用、通信方式等方麵的區彆。我們將深入探討多綫程編程帶來的優勢,例如提高程序的響應速度和吞吐量。 同時,多綫程編程也伴隨著諸多挑戰,如數據競爭、死鎖等。本書將為你揭示這些並發編程中的陷阱,並介紹綫程同步的常用機製,如互斥鎖、信號量、條件變量等,讓你掌握編寫健壯、高效的多綫程程序的關鍵。 5. 係統調用的橋梁:用戶空間與內核空間的交互 應用程序在用戶空間運行,而操作係統則運行在特權更高的內核空間。當應用程序需要訪問硬件資源、創建新進程、進行文件I/O等操作時,它必須通過“係統調用”嚮操作係統發齣請求。本書將深入解析係統調用的原理,揭示用戶空間和內核空間是如何通過這一機製進行交互的。 我們將瞭解不同類型的係統調用,以及它們在操作係統內部是如何被處理的。理解係統調用,你將明白應用程序與操作係統之間的界限,以及操作係統如何作為硬件的守護者,為應用程序提供安全、可靠的服務。 6. 文件係統的奧秘:數據的持久化與組織 數據需要被持久化存儲,這便是文件係統的職責。本書將帶你探索文件係統的內部機製。文件和目錄是如何組織的?文件係統如何管理磁盤空間,實現文件的創建、刪除、讀寫?我們將瞭解不同的文件係統類型,以及它們在設計上的差異。 本書還將深入文件係統的元數據管理,理解 inode 的作用,以及目錄項如何關聯文件名與文件數據。你將明白,看似簡單的文件操作背後,是文件係統復雜而精巧的設計。 7. 網絡通信的基石:從數據包到連接的旅程 在信息爆炸的時代,網絡通信無處不在。本書將為你勾勒齣網絡通信的整體圖景,從底層的數據包傳輸到應用層的協議。我們將探討TCP/IP協議棧的工作原理,瞭解IP地址、端口號的含義,以及TCP的可靠連接是如何建立和維護的。 雖然我們不深入 x86/x64 特定的網絡編程接口,但本書將為你建立起理解任何網絡通信協議和機製的紮實基礎。你將理解,為何網絡上的信息能夠準確無誤地從一個設備傳輸到另一個設備,其背後的技術是何等精妙。 二、 編程的深度:在理解的基礎上構建高效應用 掌握瞭計算機係統的底層邏輯,你的編程能力將邁上一個全新的颱階。本書並非止步於理論的闡述,更重要的是將這些底層知識轉化為解決實際編程問題的能力。 1. 性能優化的藝術:洞悉瓶頸,榨乾每一分潛力 理解瞭CPU的工作原理、內存的訪問模式、以及數據的流動,你便能更好地進行性能優化。本書將指導你如何識彆程序中的性能瓶頸,例如CPU密集型計算、頻繁的內存訪問、低效的I/O操作等。 我們將探討一些通用的性能優化技巧,例如算法的優化、數據結構的閤理選擇、緩存友好型編程等。通過對係統運行機製的深入理解,你將能夠編寫齣更快速、更節省資源的程序。 2. 安全性的考量:防患於未然,守護數據安寜 瞭解瞭內存管理、進程隔離等底層機製,你便能更深刻地理解程序安全性的重要性。本書將引導你認識常見的安全漏洞,例如緩衝區溢齣、整數溢齣等,並探討如何通過良好的編程實踐來避免這些問題。 我們將討論操作係統提供的安全機製,例如地址空間布局隨機化(ASLR)、數據執行保護(DEP)等,以及它們如何在底層幫助我們抵禦攻擊。理解底層原理,你便能更好地編寫齣安全可靠的軟件。 3. 跨平颱開發的思維:理解共性,規避特性 雖然本書不針對特定架構,但其所闡述的底層原理,卻是構建跨平颱軟件的基礎。通過理解不同操作係統在內存管理、進程調度、文件I/O等方麵的通用原理和細微差異,你將能夠寫齣更具可移植性的代碼,並能更好地應對跨平颱開發中的挑戰。 三、 誰適閤閱讀這本書? 初級開發者: 渴望深入理解代碼如何運行,而不僅僅是調用API的開發者。 中高級開發者: 希望提升程序性能、理解程序安全,並能站在係統層麵思考問題的開發者。 操作係統愛好者: 對計算機係統內部運作充滿好奇,希望構建更全麵知識體係的學習者。 計算機科學專業的學生: 將本書作為理解操作係統、計算機組成原理等課程的補充材料,加深理論認知。 任何對技術有強烈求知欲的人: 願意投入時間和精力,探索技術世界深層奧秘的讀者。 《代碼的深度:不止於 x86/x64 的係統之旅》 將是你理解計算機世界的最佳嚮導。它將為你打開一扇通往更廣闊技術領域的大門,讓你在未來的學習和實踐中,擁有更清晰的視野和更強大的能力。讓我們一起,從“知道”走嚮“理解”,從“使用”走嚮“創造”,共同探索代碼的深度。