簡介
本書通過對Delphi核心(RTL)原始碼進行分析,深入闡述了Delphi核心(RTL)的原理及其實現。全書從Nico Bendlin編寫的著名最小化核心示例程式MiniDExe講起,基於MiniDExe分析Delphi在編譯器一級的技術內幕,帶領讀者一窺Delphi的核心。隨後作者基於這個核心逐層地包裝代碼,將Delphi的各種功能的具體實現一一展現,通過列出關鍵性代碼並進行系統性分析的方式,全面分析對象結構、VCL和COM等在原始碼中的實現。全書內容詳實,闡述精闢、深入,主要議題包括:Delphi的編譯器在Windows、Delphi RTL和用戶代碼之間的互動;Delphi RTL核心代碼的完整實現;與Delphi核心相關的作業系統機制;初始(入口)代碼、模組、記憶體、執行緒、資源、異常處理機制等。
本書是一本不可多得的高端技術圖書,適合中、高級Delphi開發人員研讀。
目錄
序 i
前言 I
第一部分 Delphi核心深入剖析(I) 1
第1章 最小化Delphi核心 3
1.1 MiniDExe如何實現核心最小化 3
1.1.1 MiniDExe中的System.pas單元 4
1.1.2 MiniDExe中的SysInit.pas單元 5
1.1.3 MiniDExe中的項目檔案MiniDExe.dpr 6
1.2 一些其他的核心最佳化 6
1.3 為什麼要研究最小化核心 7
第2章 基本數據類型的實現 9
2.1 基本數據類型 9
2.2 變數與常量 11
2.2.1 全局變數與局部變數 11
2.2.2 動態分配的記憶體 12
2.2.3 換一個方式來理解 13
2.2.4 常量 14
2.3 數據結構的實現 16
2.3.1 簡單類型 16
2.3.2 字元串 16
2.3.3 構造類型 26
2.3.4 指針類型 28
2.3.5 過程類型 28
2.4 數據結構相關的例程 29
2.4.1 標準Pascal的內置例程 30
2.4.2 字元串操作例程 31
2.5 變數的類型檢測與強制轉換 47
2.6 引用-計數-寫複製與類型信息 48
2.6.1 引用計數與增加引用 48
2.6.2 “增加引用”何時發生 49
2.6.3 增加引用的操作是依賴類型信息來實現的 51
2.6.4 寫複製與值參數的備份 53
第3章 BASM(Borland彙編語言)精要 55
3.1 BASM概念簡要 55
3.2 表達式的類別與類型 56
3.3 數據定義和數據類型強制轉換 57
3.4 例程入口參數及調用約定 61
3.5 例程和API的調用與流程控制 62
3.6 完全彙編例程與內嵌彙編例程 65
3.7 彙編例程中的返回值約定 66
3.8 其他 67
第4章 初始化與結束化過程 71
4.1 變數的初始化與結束化 71
4.1.1 初始化的必要性 72
4.1.2 如何初始化 73
4.1.3 如何結束化 74
4.2 例程的初始化與結束化 76
4.3 單元初始化與結束化 77
4.4 模組初始化與結束化 79
4.4.1 模組入口代碼 79
4.4.2 編譯器決定的程式執行流程 80
第5章 面向Windows開發的基本實現 83
5.1 Win32應用程式:EXE 83
5.1.1 適應Win32應用程式的最簡化核心 83
5.1.2 初始化例程_InitExe() 85
5.1.3 內部模組表管理例程 86
5.1.4 .EXE啟動例程_StartExe() 87
5.1.5 應用程式的結束化控制 88
5.2 32位的DOS:控制台應用程式 91
5.2.1 控制台應用程式的模組入口代碼 91
5.2.2 控制台應用程式的最小化實現 92
5.2.3 控制台應用程式的Delphi實現 93
5.2.4 檔案操作例程與控制台應用程式 94
5.2.5 控制台的開啟與關閉 97
5.2.6 CRT單元與Input、Output的重載 98
5.3 動態程式庫:DLL 99
5.3.1 丟失的DllMain() 99
5.3.2 _InitLib()例程 101
5.3.3 _StartLib()例程 101
5.3.4 .DLL的結束化過程 102
5.3.5 DllProc與DllMain()的不同 105
5.3.6 動態程式庫的核心最小化 106
5.4 Delphi的動態程式庫:包 108
5.4.1 包的主要規則 108
5.4.2 Delphi中的包與普通DLL的區別 110
5.4.3 包的DllMain() 111
5.4.4 包的載入例程LoadPackage() 112
5.4.5 真正的初始化例程InitializePackage() 112
5.4.6 包的卸載例程UnloadPackage() 115
5.4.7 包的基本輸出例程 115
5.4.8 內部例程_PackageLoad()與_PackageUnload() 116
5.4.9 包的核心最小化 117
5.5 其他 118
5.5.1 初始化上下文中OuterContext域的使用 118
5.5.2 入口代碼中的堆疊使用深入分析(記憶體現場) 119
5.5.3 再論入口代碼 123
第6章 Delphi的積木藝術(PE) 127
6.1pe檔案結構概要 127
6.1.1 檔案頭 129
6.1.2 節表 131
6.1.3 節 132
6.1.4 PE檔案與記憶體映射 134
6.1.5 有關相對虛地址的計算 138
6.2 Delphi的PE檔案頭中一些重要的域 142
6.3 Delphi的PE檔案中一些重要的節 144
6.3.1執行緒局部存儲(.tls和.rdata) 144
6.3.2 資源節(.rsrc) 145
6.3.3 導入、導出表(.idata和.edata) 146
6.3.4 數據節與代碼節(DATA、BSS和CODE) 154
6.3.5 重定位節(.reloc) 157
6.4 3.5K的秘密 159
6.4.1 Delphi的PE檔案頭部 159
6.4.2 Delphi的PE檔案的節及其默認對齊 160
6.4.3 還可能更小嗎 160
6.4.4 3.5K代碼的記憶體映射 161
6.5 入口點 162
第二部分 Delphi核心深入剖析(II) 167
第7章 Delphi的記憶體管理器 169
7.1 Delphi的記憶體管理器實現框架 169
7.2 記憶體頁管理 171
7.3 堆 172
7.4 MemoryManager及相關例程 172
7.5 GetMem.inc中的重要例程 174
7.5.1 堆塊及其管理例程 175
7.5.2 虛地址空間(Address space)管理 178
7.5.3 已提交的記憶體空間(Committed space)管理 179
7.5.4 用戶調用例程(actually calls)的實現 180
7.5.5 初始化、結束化與其他輔助例程 194
7.6 遍歷全部記憶體塊 195
7.7 共享記憶體管理器 197
7.8 第三方記憶體管理器 200
7.9 小結 201
第8章 錯誤和異常 203
8.1 錯誤 203
8.2 斷言 206
8.3 Windows與Delphi中的異常處理機制概要 209
8.4 編譯器對異常處理機制的實現 212
8.4.1 最小化核心的啟示 212
8.4.2 從作業系統的角度來理解編譯器行為 216
8.4.3 try..finally/except..end語法關鍵字與內部例程 219
8.5 基本(except型)異常處理 221
8.5.1 異常觸發(Raise) 221
8.5.2 多層(嵌套)的異常處理 222
8.5.3 異常展開(Unwind) 223
8.5.4 異常回響(Notify) 227
8.5.5 頂層異常處理 229
8.6 使用面向對象技術的異常類 233
8.6.1 異常列表、RaiseFrame與ExceptionRecord 233
8.6.2 未知異常映射:ExceptObjProc 235
8.6.3 不使用SysUtils.pas單元的應用程式 236
8.6.4 _RaiseExcept()、_RaiseAgain()與_DoneExcept()例程 238
8.6.5 異常對象 241
8.6.6 異常類型檢測的依賴性問題 247
第9章 多執行緒的實現及調度 251
9.1 作業系統的進程與執行緒 252
9.1.1 執行緒的啟動過程 253
9.1.3 執行緒有哪些獨立元素 256
9.2 作業系統的執行緒調度概要 257
9.3 基本的多執行緒套用 258
9.4 執行緒變數(執行緒局部存儲) 261
9.4.1 執行緒局部存儲(TLS)的實質 262
9.4.2 編譯器的準備工作 263
9.4.3 靜態TLS:EXE模組中的TLS 265
9.4.4 動態TLS:DLL模組中的TLS 266
9.5 再論FS段 268
9.6 執行緒類(TThread) 272
9.6.1 執行緒執行體(Execute) 275
9.6.2 執行緒與主執行緒的同步(synchronize) 277
9.6.3 控制台套用的多執行緒同步(第三方的WakeMainThread例程) 287
9.6.4 執行緒中止和結束(Terminate) 292
9.7 執行緒同步對象 297
9.7.1 執行緒同步方法 298
9.7.2 Delphi中的執行緒同步類 306
9.7.3 執行緒對象的WaitFor()方法 311
9.8 多執行緒環境下的記憶體管理器 312
第10章 資源的管理和使用 315
10.1 資源字元串 315
10.1.1 隱含的調用:LoadResString()例程 315
10.1.2 _InitResStrings()例程 317
10.1.3 _InitResStringImports()例程 319
10.1.4 _InitImports()例程 320
10.2 Delphi編譯的PE檔案的默認資源 322
10.2.1 PACKAGEINFO資源 323
10.2.2 PACKAGEOPTIONS資源 324
10.2.3 DVCLAL資源 326
10.2.4 DESCRIPTION資源 327
10.3 其他 327
第11章 突破Delphi在套用開發上的限制 329
11.1 開發DOS保護模式程式 329
11.2 開發Windows9x上的驅動程式 335
11.2.1 Delphi編譯的.obj檔案335
11.2.2 第三方的連結器處理Delphi的.OBJ檔案的問題 336
11.2.3 在Delphi中編寫VxD驅動程式代碼 337
11.2.4 連結目標檔案並輸出VxD驅動程式 338
11.3 開發WinNT/2000上的驅動程式 339
11.4 其他 342
術語表 343
參考書目 347