第一部分Delphi内核深入剖析(Ⅰ) 1
第9章多线程的实现及调度 (25 1
目 录 1
序 1
前言 1
1.1 MiniDExe如何实现内核最小化 3
第1章最小化Delphi内核 3
1.1.1 MiniDExe中的System.pas单元 4
1.1.2 MiniDExe中的Syslnit.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.1引用计数与增加引用 48
2.6引用-计数-写复制与类型信息 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.1单元初始化与结束化的内部例程 77
4.3单元初始化与结束化 77
4.3.2其他初始化例程 79
4.4模块初始化与结束化 79
4.4.1模块入口代码 79
4.4.2编译器决定的程序执行流程 80
5.1 Win32应用程序:EXE 83
5.1.1 适应Win32应用程序的最简化内核 83
第5章面向Windows开发的基本实现 83
5.1.2初始化例程程_nitExe() 85
5.1.3内部模块表管理例程 86
5.1.4EXE启动例程_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.1 PE文件结构概要 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
6.5.1磁盘文件上的入口代码(RAWAddress) 163
6.5.2反编译器使用相对基地址定位的入口代码(RVA) 164
6.5.3载入到内存之后(运行期)的入口代码(VA) 164
第二部分Delphi内核深入剖析(Ⅱ) 167
第7章Delphi的内存管理器 169
7.1 Delphi的内存管理器实现框架 169
7.2内存页管理 171
7.4MemoryManager及相关例程 172
7.3堆 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.2多层(嵌套)的异常处理 222
8.5.1异常触发(Raise) 222
8.5.3异常展开(Unwind) 224
8.5.4异常响应(Notify) 227
8.5.5顶层异常处理 229
8.6使用面向对象技术的异常类 232
8.6.1异常列表、RaiseFrame与ExceptionRecord 233
8.6.2未知异常映射:ExceptObjProc 234
8.6.3不使用SysUtils.pas单元的应用程序 236
8.6.4_RaiseExcept()、_RaiseAgain()与_DoneExcept()例程 237
8.6.5异常对象 240
8.6.6异常类型检测的依赖性问题 247
9.1操作系统的进程与线程 252
9.1.1 线程的启动过程 253
9.1.2主线程与用户线程启动过程的比较 255
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中的线程同步类 305
9.7.3线程对象的WaitFor()方法 310
9.8多线程环境下的内存管理器 312
10.1资源字符串 315
10.1.1隐含的调用:LoadResString()例程 315
第10章资源的管理和使用 315
10.1.2_InitResStrings()例程 317
10.1.3_InitResStringlmports()例程 319
10.1.4_Initlmports()例程 320
10.2 Delphi编译的PE文件的默认资源 322
10.2.1PACKAGEINFO资源 323
10.2.2 PACKAGEOPTIONS资源 324
10.2.3 DVCLAL资源 326
10.2.4 DESCRlPTION资源 327
10.3其他 327
11.1开发DOS保护模式程序 329
11.1.1 Delphi 1.0与DOS 16位保护模式程序 329
第11章突破Delphi在应用开发上的限制 329
11.1.2 WDOSX、Delphi 2.0-4.0与DOS 32位保护模式程序 331
11.1.3 DWP、DWPL、Delphi 5.0-7.0与DOS 32位保护模式程序中 333
的图形接口 333
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