《Windows核心設計思想》是2015年3月電子工業出版社出版的圖書,作者是陳樹寶。
基本介紹
- 書名:Windows核心設計思想
- 作者:陳樹寶
- ISBN:9787121253140
- 出版社:電子工業出版社
- 出版時間:2015年3月
- 頁數:636
- 字數:992千字
- 開本:16(185*260)
- 版次:01-01
內容簡介,圖書目錄,
內容簡介
本書主要講述 Windows 核心的設計過程,從最底層的細節使用源碼一步一步分析,結 合 Bochs 和 WinDbg 調試器進行驗證。本書提供全部原始碼和能直接編譯的項目工程,集理論、架構、編碼、運行和調試於一體進行講述,從多種角度呈現核心構架的基本流程。本書主要包括了 Windows 核心載入器(ntldr)的分析,Windows 核心調試組件的設計,實現結構化異常處理的支持,並對記憶體管理和對象管理進行了精心講解,同時對基於 IRP 請求包的 I/O 系統進行了論述,並且介紹了如何設計檔案系統,最後簡單講解了進程和執行緒的一些基本知識。
圖書目錄
目錄
推薦序1 iii
推薦序2 v
序言 vii
前言 ix
第1章 搭建開發和調試環境 1
1.1 編譯環境 1
1.2 使用 Bochs 運行 ntos.img 2
1.3 使用 VMware 運行 ntos.vmdk 3
1.4 模擬調試運行 6
1.5 編程思想(等差數列求和) 8
1.6 函式調用約定 14
1.7 模組擴展約定 15
1.8 本章總結 15
第2章 Windows 核心載入器(SU) 16
2.1 主引導記錄(MBR) 18
2.2 系統分區(Partition1) 25
2.3 SU 模組(startup.com) 28
2.3.1 原版 Windows Server 2003 系統 NTLDR startup.com 基本分析 28
2.3.2 根據原理重新構建新的 startup.com 30
2.4 檢測物理記憶體 32
2.5 開啟 A20 地址線 40
2.6 重新定位 GDT 和 IDT 42
2.7 保護模式 43
2.7.1 段描述符(Segment Descriptor) 43
2.7.2 特權級(privilege level) 48
2.7.3 段描述符表(segment descriptor table) 50
2.7.4 開啟保護模式 51
2.8 載入 Loader 模組 53
2.9 轉移控制權 59
2.10 導出函式 59
2.10.1 讀寫扇區 62
2.10.2 獲取物理記憶體塊 63
2.10.3 檢測硬體 64
2.11 本章總結 64
第3章 Windows 核心調試設計 66
3.1 初始化調試系統 67
3.2 初始化模擬調試 74
3.3 初始化核心調試 76
3.3.1 中斷和異常向量表 76
3.3.2 註冊異常處理例程 79
3.3.3 基於棧框架的異常處理程式 82
3.3.4 除零錯誤(#DE) 85
3.3.5 單步異常(#DB) 90
3.3.6 斷點異常(#BP) 91
3.3.7 一般保護性錯誤(#GP) 91
3.3.8 頁面錯誤(#PF) 92
3.3.9 調試器服務(debugger service) 93
3.4 分發異常 94
3.5 核心調試分發 102
3.5.1 列印字元串 106
3.5.2 載入/卸載符號 109
3.5.3 報告異常 115
3.6 核心調試引擎核心 118
3.6.1 獲取系統版本 125
3.6.2 獲取/設定機器信息 126
3.6.3 讀/寫虛擬記憶體 126
3.6.4 設定/恢復斷點 130
3.7 調試通信協定 136
3.7.1 串列連線埠 136
3.7.2 COM 暫存器 138
3.7.3 波特率 139
3.7.4 連線埠初始化 140
3.7.5 通信協定 142
3.7.6 讀連線埠 142
3.7.7 寫連線埠 146
3.7.8 調試包 147
3.7.9 接收調試包(KdReceivePacket) 150
3.7.10 傳送調試包(KdSendPacket) 157
3.8 本章總結 160
第4章 Windows 核心載入器(Loader) 161
4.1 NtProcessStartup 162
4.2 PcMachInit 165
4.3 初始化記憶體管理器 166
4.3.1 記憶體描述符表 167
4.3.2 頁面查找表 175
4.3.3 初始化堆 182
4.4 分頁機制 195
4.4.1 頁幀號(PFN) 195
4.4.2 頁目錄和頁表 197
4.4.3 開啟分頁機制 198
4.4.4 虛擬地址轉譯物理地址 208
4.4.5 修改頁目錄和頁表位置 210
4.5 Loader 讀/寫支持 211
4.5.1 ARC 接口標準 211
4.5.2 虛擬磁碟驅動(RamDisk) 219
4.5.3 磁碟驅動(Hwdisk) 220
4.5.4 檔案系統驅動(Ldfs) 226
4.6 載入器參數塊 232
4.7 載入和啟動核心 233
4.7.1 收集硬體信息 238
4.7.2 本地語言支持(NLS) 239
4.7.3 載入模組 240
4.7.4 記憶體描述符鍊表 244
4.7.5 處理器控制域(PCR)和任務狀態段(TSS) 246
4.8 本章總結 251
第5章 結構化異常處理 252
5.1 異常觸發 254
5.2 分發異常(RtlDispatchException) 257
5.3 異常處理(_except_handler3) 262
5.4 全局展開(__global_unwind2) 266
5.5 局部展開(__local_unwind2) 272
5.6 冒泡排序(BubbleSort) 274
5.7 本章總結 275
第6章 記憶體管理 276
6.1 物理記憶體管理概述 276
6.2 虛擬地址空間布局 277
6.3 初始化記憶體系統(MmArmInitSystem) 278
6.4 初始化機器相關(MiInitMachineDependent) 296
6.5 初始化非分頁池(MiInitializeNonPagedPool) 305
6.6 初始化系統 PTE(MiInitializeSystemPtes) 309
6.7 映射頁幀資料庫(MiMapPfnDatabase) 310
6.8 初始化顏色表(MiInitializeColorTables) 313
6.9 初始化頁幀號資料庫(MiInitializePfnDatabase) 315
6.9.1 從頁面建立頁幀號資料庫(MiBuildPfnDatabaseFromPages) 319
6.9.2 從載入塊物理記憶體鍊表建立頁幀號資料庫(MiBuildPfnDatabaseFromLoad-
erBlock) 323
6.10 初始化池(InitializePool) 330
6.11 分配池頁面(MiAllocatePoolPages) 335
6.11.1 非分頁池分配 342
6.11.2 分頁池分配 343
6.11.3 分頁池頁面錯誤處理 344
6.12 釋放池頁(MiFreePoolPages) 347
6.12.1 釋放分頁池 352
6.12.2 釋放非分頁池 353
6.13 建立分頁池(MiBuildPagedPool) 354
6.14 分配池記憶體(ExAllocatePoolWithTag) 360
6.15 釋放池記憶體(ExFreePoolWithTag) 371
6.16 初始化系統空間映射(MiInitializeSystemSpaceMap) 379
6.17 本章總結 381
第7章 對象管理 382
7.1 對象概述 382
7.1.1 對象整體結構 382
7.1.2 對象頭(object header) 385
7.1.3 對象類型(object type) 386
7.1.4 對象類型例程模板(object type procedure template) 387
7.2 分配對象記憶體空間(ObpAllocateObject) 390
7.3 釋放對象記憶體空間(ObpDeallocateObject) 397
7.4 初始化對象系統(ObInitSystem) 399
7.5 創建句柄表(ExCreateHandleTable) 406
7.6 創建對象類型(ObCreateObjectType) 410
7.7 創建目錄對象(NtCreateDirectoryObject) 416
7.8 創建對象(ObCreateObject) 418
7.9 插入對象(ObInsertObject) 421
7.10 查找對象名(ObpLookupObjectName) 428
7.11 查找目錄項(ObpLookupEntryDirectory) 445
7.12 創建無名句柄(ObpCreateUnnamedHandle) 448
7.13 分配句柄表項(ExpAllocateHandleTableEntry) 452
7.14 解析符號連結(ObpParseSymbolicLink) 465
7.15 Section 和 Segment 469
7.15.1 Prototype PTE 頁面異常處理 478
7.15.2 Section 映射到系統進程 481
7.15.3 VAD 頁面錯誤處理 482
7.16 本章總結 483
第8章 I/O 系統 485
8.1 初始化 I/O 系統(IoInitSystem) 486
8.2 創建驅動對象(IopCreateDriver) 497
8.3 創建設備對象(IoCreateDevice) 503
8.4 分配 I/O 請求包(IoAllocateIrp) 508
8.5 傳遞 I/O 請求包(IoCallDriver) 513
8.6 釋放 I/O 請求包(IoFreeIrp) 514
8.7 解析設備(IopParseDevice) 515
8.8 磁碟讀/寫支持 525
8.9 本章總結 532
第9章 檔案系統設計 533
9.1 檔案系統初始化(DriverEntry) 533
9.2 掛載卷(NtfsMountVolume) 536
9.2.1 識別檔案系統格式 540
9.2.2 檔案控制塊(FCB) 542
9.2.3 上下文控制塊(CCB) 544
9.2.4 創建流檔案對象(IoCreateStreamFileObject) 544
9.2.5 初始化快取映射(CcInitializeCacheMap) 545
9.3 打開檔案(NtfsOpenFile) 547
9.4 讀檔案(NtfsReadFile) 553
9.5 關閉檔案(NtfsCloseFile) 555
9.6 發起卷掛載請求 561
9.7 載入 NTDLL 564
9.7.1 打開 NTDLL 564
9.7.2 檢查 NTDLL 映像(MmCheckSystemImage) 565
9.7.3 創建 NTDLL Section 569
9.7.4 映射 NTDLL Section 到當前進程空間 570
9.7.5 獲取用戶進入點 571
9.8 本章總結 573
第 10 章 進程和執行緒 574
10.1 進程和執行緒初始化 575
10.1.1 初始化進程 576
10.1.2 初始化執行緒 578
10.1.3 初始化執行緒上下文 580
10.1.4 初始化進程系統(PspInitPhase0) 584
10.2 執行緒優先權(priority) 590
10.3 執行緒狀態(thread state) 591
10.4 執行緒調度(thread dispatch) 593
10.5 分配進程虛擬記憶體(NtAllocateVirtualMemory) 601
10.6 創建用戶進程(smss.exe) 608
10.7 本章總結 608
附錄A PE格式 609
推薦序1 iii
推薦序2 v
序言 vii
前言 ix
第1章 搭建開發和調試環境 1
1.1 編譯環境 1
1.2 使用 Bochs 運行 ntos.img 2
1.3 使用 VMware 運行 ntos.vmdk 3
1.4 模擬調試運行 6
1.5 編程思想(等差數列求和) 8
1.6 函式調用約定 14
1.7 模組擴展約定 15
1.8 本章總結 15
第2章 Windows 核心載入器(SU) 16
2.1 主引導記錄(MBR) 18
2.2 系統分區(Partition1) 25
2.3 SU 模組(startup.com) 28
2.3.1 原版 Windows Server 2003 系統 NTLDR startup.com 基本分析 28
2.3.2 根據原理重新構建新的 startup.com 30
2.4 檢測物理記憶體 32
2.5 開啟 A20 地址線 40
2.6 重新定位 GDT 和 IDT 42
2.7 保護模式 43
2.7.1 段描述符(Segment Descriptor) 43
2.7.2 特權級(privilege level) 48
2.7.3 段描述符表(segment descriptor table) 50
2.7.4 開啟保護模式 51
2.8 載入 Loader 模組 53
2.9 轉移控制權 59
2.10 導出函式 59
2.10.1 讀寫扇區 62
2.10.2 獲取物理記憶體塊 63
2.10.3 檢測硬體 64
2.11 本章總結 64
第3章 Windows 核心調試設計 66
3.1 初始化調試系統 67
3.2 初始化模擬調試 74
3.3 初始化核心調試 76
3.3.1 中斷和異常向量表 76
3.3.2 註冊異常處理例程 79
3.3.3 基於棧框架的異常處理程式 82
3.3.4 除零錯誤(#DE) 85
3.3.5 單步異常(#DB) 90
3.3.6 斷點異常(#BP) 91
3.3.7 一般保護性錯誤(#GP) 91
3.3.8 頁面錯誤(#PF) 92
3.3.9 調試器服務(debugger service) 93
3.4 分發異常 94
3.5 核心調試分發 102
3.5.1 列印字元串 106
3.5.2 載入/卸載符號 109
3.5.3 報告異常 115
3.6 核心調試引擎核心 118
3.6.1 獲取系統版本 125
3.6.2 獲取/設定機器信息 126
3.6.3 讀/寫虛擬記憶體 126
3.6.4 設定/恢復斷點 130
3.7 調試通信協定 136
3.7.1 串列連線埠 136
3.7.2 COM 暫存器 138
3.7.3 波特率 139
3.7.4 連線埠初始化 140
3.7.5 通信協定 142
3.7.6 讀連線埠 142
3.7.7 寫連線埠 146
3.7.8 調試包 147
3.7.9 接收調試包(KdReceivePacket) 150
3.7.10 傳送調試包(KdSendPacket) 157
3.8 本章總結 160
第4章 Windows 核心載入器(Loader) 161
4.1 NtProcessStartup 162
4.2 PcMachInit 165
4.3 初始化記憶體管理器 166
4.3.1 記憶體描述符表 167
4.3.2 頁面查找表 175
4.3.3 初始化堆 182
4.4 分頁機制 195
4.4.1 頁幀號(PFN) 195
4.4.2 頁目錄和頁表 197
4.4.3 開啟分頁機制 198
4.4.4 虛擬地址轉譯物理地址 208
4.4.5 修改頁目錄和頁表位置 210
4.5 Loader 讀/寫支持 211
4.5.1 ARC 接口標準 211
4.5.2 虛擬磁碟驅動(RamDisk) 219
4.5.3 磁碟驅動(Hwdisk) 220
4.5.4 檔案系統驅動(Ldfs) 226
4.6 載入器參數塊 232
4.7 載入和啟動核心 233
4.7.1 收集硬體信息 238
4.7.2 本地語言支持(NLS) 239
4.7.3 載入模組 240
4.7.4 記憶體描述符鍊表 244
4.7.5 處理器控制域(PCR)和任務狀態段(TSS) 246
4.8 本章總結 251
第5章 結構化異常處理 252
5.1 異常觸發 254
5.2 分發異常(RtlDispatchException) 257
5.3 異常處理(_except_handler3) 262
5.4 全局展開(__global_unwind2) 266
5.5 局部展開(__local_unwind2) 272
5.6 冒泡排序(BubbleSort) 274
5.7 本章總結 275
第6章 記憶體管理 276
6.1 物理記憶體管理概述 276
6.2 虛擬地址空間布局 277
6.3 初始化記憶體系統(MmArmInitSystem) 278
6.4 初始化機器相關(MiInitMachineDependent) 296
6.5 初始化非分頁池(MiInitializeNonPagedPool) 305
6.6 初始化系統 PTE(MiInitializeSystemPtes) 309
6.7 映射頁幀資料庫(MiMapPfnDatabase) 310
6.8 初始化顏色表(MiInitializeColorTables) 313
6.9 初始化頁幀號資料庫(MiInitializePfnDatabase) 315
6.9.1 從頁面建立頁幀號資料庫(MiBuildPfnDatabaseFromPages) 319
6.9.2 從載入塊物理記憶體鍊表建立頁幀號資料庫(MiBuildPfnDatabaseFromLoad-
erBlock) 323
6.10 初始化池(InitializePool) 330
6.11 分配池頁面(MiAllocatePoolPages) 335
6.11.1 非分頁池分配 342
6.11.2 分頁池分配 343
6.11.3 分頁池頁面錯誤處理 344
6.12 釋放池頁(MiFreePoolPages) 347
6.12.1 釋放分頁池 352
6.12.2 釋放非分頁池 353
6.13 建立分頁池(MiBuildPagedPool) 354
6.14 分配池記憶體(ExAllocatePoolWithTag) 360
6.15 釋放池記憶體(ExFreePoolWithTag) 371
6.16 初始化系統空間映射(MiInitializeSystemSpaceMap) 379
6.17 本章總結 381
第7章 對象管理 382
7.1 對象概述 382
7.1.1 對象整體結構 382
7.1.2 對象頭(object header) 385
7.1.3 對象類型(object type) 386
7.1.4 對象類型例程模板(object type procedure template) 387
7.2 分配對象記憶體空間(ObpAllocateObject) 390
7.3 釋放對象記憶體空間(ObpDeallocateObject) 397
7.4 初始化對象系統(ObInitSystem) 399
7.5 創建句柄表(ExCreateHandleTable) 406
7.6 創建對象類型(ObCreateObjectType) 410
7.7 創建目錄對象(NtCreateDirectoryObject) 416
7.8 創建對象(ObCreateObject) 418
7.9 插入對象(ObInsertObject) 421
7.10 查找對象名(ObpLookupObjectName) 428
7.11 查找目錄項(ObpLookupEntryDirectory) 445
7.12 創建無名句柄(ObpCreateUnnamedHandle) 448
7.13 分配句柄表項(ExpAllocateHandleTableEntry) 452
7.14 解析符號連結(ObpParseSymbolicLink) 465
7.15 Section 和 Segment 469
7.15.1 Prototype PTE 頁面異常處理 478
7.15.2 Section 映射到系統進程 481
7.15.3 VAD 頁面錯誤處理 482
7.16 本章總結 483
第8章 I/O 系統 485
8.1 初始化 I/O 系統(IoInitSystem) 486
8.2 創建驅動對象(IopCreateDriver) 497
8.3 創建設備對象(IoCreateDevice) 503
8.4 分配 I/O 請求包(IoAllocateIrp) 508
8.5 傳遞 I/O 請求包(IoCallDriver) 513
8.6 釋放 I/O 請求包(IoFreeIrp) 514
8.7 解析設備(IopParseDevice) 515
8.8 磁碟讀/寫支持 525
8.9 本章總結 532
第9章 檔案系統設計 533
9.1 檔案系統初始化(DriverEntry) 533
9.2 掛載卷(NtfsMountVolume) 536
9.2.1 識別檔案系統格式 540
9.2.2 檔案控制塊(FCB) 542
9.2.3 上下文控制塊(CCB) 544
9.2.4 創建流檔案對象(IoCreateStreamFileObject) 544
9.2.5 初始化快取映射(CcInitializeCacheMap) 545
9.3 打開檔案(NtfsOpenFile) 547
9.4 讀檔案(NtfsReadFile) 553
9.5 關閉檔案(NtfsCloseFile) 555
9.6 發起卷掛載請求 561
9.7 載入 NTDLL 564
9.7.1 打開 NTDLL 564
9.7.2 檢查 NTDLL 映像(MmCheckSystemImage) 565
9.7.3 創建 NTDLL Section 569
9.7.4 映射 NTDLL Section 到當前進程空間 570
9.7.5 獲取用戶進入點 571
9.8 本章總結 573
第 10 章 進程和執行緒 574
10.1 進程和執行緒初始化 575
10.1.1 初始化進程 576
10.1.2 初始化執行緒 578
10.1.3 初始化執行緒上下文 580
10.1.4 初始化進程系統(PspInitPhase0) 584
10.2 執行緒優先權(priority) 590
10.3 執行緒狀態(thread state) 591
10.4 執行緒調度(thread dispatch) 593
10.5 分配進程虛擬記憶體(NtAllocateVirtualMemory) 601
10.6 創建用戶進程(smss.exe) 608
10.7 本章總結 608
附錄A PE格式 609