《操作系统实现之路》
出版说明
前言
第1章 操作系统概述 1
1.1 操作系统的基本概念 1
1.1.1 操作系统的功能 1
1.1.2 操作系统的分类 2
1.1.3 操作系统的发展趋势 2
1.1.4 操作系统的基本概念 3
1.2 嵌入式系统和嵌入式操作系统 6
1.2.1 嵌入式系统概述 6
1.2.2 嵌入式操作系统概述 7
1.2.3 嵌入式操作系统的特点 7
1.2.4 嵌入式操作系统与通用操作系统的区别 8
1.2.5 嵌入式实时操作系统 9
1.3 Hello China操作系统概述 10
1.3.1 Hello China的主要功能 10
1.3.2 Hello China的架构 12
1.3.3 Hello China的主要特点 12
1.3.4 Hello China的应用场景 14
1.3.5 面向对象思想的模拟 17
1.4 实例:一个简单的IP路由器的实现 20
1.4.1 概述 20
1.4.2 路由器的硬件结构 21
1.4.3 路由器的软件功能 22
1.4.4 各任务的实现 23
第2章 Hello China的安装和使用 26
2.1 Hello China安装概述 26
2.2 Hello China在Virtual PC上的安装 26
2.2.1 Hello China在Virtual PC上的启动过程 26
2.2.2 Hello China在Virtual PC上的安装过程 28
2.3 Hello China在物理计算机上的安装 31
2.3.1 安装注意事项 31
2.3.2 在Windows XP操作系统上的安装 31
2.3.3 在Windows 7操作系统上的安装 32
2.4 Hello China的卸载 34
2.5 Hello China的使用 34
2.6 内核的编译和生成 35
2.6.1 Hello China内核的开发环境 35
2.6.2 开发环境的搭建 36
2.6.3 内核映像文件的生成 38
第3章 Hello China的引导和初始化 41
3.1 概述 41
3.2 个人计算机的引导和初始化 41
3.2.1 BIOS的引导工作 41
3.2.2 硬盘逻辑结构及引导扇区的功能 42
3.2.3 操作系统引导扇区的功能和局限 44
3.2.4 预置引导法概述 45
3.2.5 预置引导法在FAT32文件系统上的实现 46
3.2.6 预置引导法在NTFS文件系统上的实现 47
3.2.7 通过软盘启动Hello China 49
3.3 嵌入式操作系统的引导和初始化 53
3.3.1 典型嵌入式系统内存映射布局 53
3.3.2 嵌入式系统的启动概述 54
3.3.3 常见嵌入式操作系统的加载方式 55
3.3.4 嵌入式系统软件的写入 59
3.4 Hello China的初始化 61
3.4.1 实地址模式下的初始化 61
3.4.2 保护模式下的初始化 65
3.4.3 操作系统核心功能的初始化 68
3.4.4 Hello China的内存布局图 73
3.5 Hello China的字符shell 74
3.5.1 字符shell的概述和启动 74
3.5.2 shell的消息处理过程 75
3.5.3 实例:增加一个字符shell内置命令 78
3.6 从保护模式切换回实模式 79
3.6.1 模式切换概述 79
3.6.2 实模式服务调用举例 81
3.6.3 保护模式切换到实模式 82
3.7 引导和初始化总结 87
第4章 Hello China线程的实现 88
4.1 进程、线程和任务 88
4.2 Hello China的线程实现 89
4.2.1 核心线程管理对象 89
4.2.2 线程的状态及其切换 95
4.2.3 核心线程对象 96
4.2.4 线程的上下文 99
4.2.5 线程的创建和初始化 101
4.2.6 线程的结束 107
4.2.7 线程的消息队列 108
4.2.8 线程的切换—中断上下文 111
4.2.9 线程的切换—系统调用上下文 118
4.2.10 上下文保存和切换的底层函数 123
4.2.11 线程的睡眠与唤醒 128
4.2.12 核心线程实现总结 128
第5章 内存管理机制 129
5.1 内存管理机制概述 129
5.2 IA32 CPU内存管理机制 129
5.2.1 IA32 CPU内存管理机制概述 129
5.2.2 几个重要的概念 131
5.2.3 分段机制的应用 132
5.2.4 分页机制的应用 135
5.3 Power PC CPU的内存管理机制 142
5.4 Hello China内存管理模型 144
5.4.1 Hello China的内存管理模型 144
5.4.2 Hello China的内存布局 146
5.4.3 核心内存池的管理 147
5.4.4 页框管理对象 149
5.4.5 页面索引对象 154
5.4.6 虚拟内存管理对象 158
5.5 线程本地堆 175
5.5.1 线程本地堆概述 175
5.5.2 堆的功能需求定义 175
5.5.3 堆的实现概要 177
5.5.4 堆的详细实现 181
5.6 Hello China的内存管理机制总结 193
第6章 系统调用的原理与实现 194
6.1 系统调用概述 194
6.2 Hello China系统调用的实现 197
6.3 系统调用时的参数传递 199
第7章 线程互斥和同步机制的实现 204
7.1 互斥和同步概述 204
7.2 关键区段概述 204
7.3 关键区段产生的原因 205
7.3.1 多个线程之间的竞争 205
7.3.2 中断服务程序与线程之间的竞争 206
7.3.3 多个CPU之间的竞争 206
7.4 单CPU下关键区段的实现 207
7.5 多CPU下关键区段的实现 209
7.5.1 多CPU环境下的实现方式 209
7.5.2 Hello China的未来实现 210
7.6 Power PC下关键区段的实现 211
7.6.1 Power PC提供的互斥访问机制 211
7.6.2 多CPU环境下的互斥机制 212
7.7 关键区段使用注意事项 213
7.8 Semaphore概述 214
7.9 Semaphore对象的定义 214
7.10 Semaphore对象的实现 215
7.10.1 Initialize和Uninitialize的实现 216
7.10.2 WaitForThisObject的实现 217
7.10.3 WaitForThisObjectEx的实现 218
7.10.4 ReleaseSemaphore的实现 222
7.11 互斥和同步机制总结 223
第8章 中断和定时处理机制的实现 224
8.1 中断和异常概述 224
8.2 硬件相关部分处理 225
8.2.1 IA32中断处理过程 225
8.2.2 IDT初始化 226
8.3 硬件无关部分处理 230
8.3.1 系统对象和中断对象 230
8.3.2 中断调度过程 232
8.3.3 缺省中断处理函数 233
8.4 对外服务接口 234
8.5 系统时钟中断 235
8.5.1 系统时钟中断概述 235
8.5.2 系统时钟中断的初始化 236
8.5.3 系统时钟中断处理函数的主要工作 237
8.5.4 时钟中断周期对系统实时性的影响分析 239
8.6 注意事项 241
8.7 定时器概述 241
8.7.1 SetTimer函数的调用 242
8.7.2 CancelTimer函数的调用 243
8.7.3 ResetTimer函数的调用 243
8.8 设置定时器操作 243
8.9 定时器超时处理 245
8.10 定时器取消处理 247
8.11 定时器复位 248
8.12 定时器注意事项 249
第9章 系统总线和设备管理 251
9.1 系统总线概述 251
9.1.1 系统总线 251
9.1.2 总线管理模型 251
9.1.3 设备标识符 255
9.2 系统资源管理 255
9.2.1 资源描述对象 256
9.2.2 IO端口资源管理 257
9.3 驱动程序接口 257
9.3.1 GetResource 258
9.3.2 GetDevice 258
9.3.3 CheckPortRegion 258
9.3.4 ReservePortRegion 258
9.3.5 ReleasePortRegion 259
9.3.6 AppendDevice 259
9.3.7 DeleteDevice 259
9.4 PCI总线驱动程序概述 260
9.4.1 PCI总线概述 260
9.4.2 PCI设备的配置空间 260
9.4.3 配置空间关键字段的说明 262
9.4.4 PCI配置空间的读取与设置 269
9.5 PCI总线驱动程序的实现 270
9.5.1 探测PCI总线是否存在 270
9.5.2 对普通PCI设备进行枚举 271
9.5.3 配置PCI桥接设备 277
第10章 设备驱动程序管理 279
10.1 设备管理框架 279
10.1.1 概述 279
10.1.2 通用的操作系统设备管理机制 281
10.1.3 设备管理框架的实现 285
10.1.4 IO管理器 287
10.2 设备驱动程序 295
10.2.1 设备请求控制块 295
10.2.2 设备驱动程序对象的定义 298
10.2.3 设备驱动程序的物理结构 299
10.2.4 设备驱动程序的功能函数 300
10.2.5 DriverEntry的实现 302
10.2.6 UnloadEntry的实现 303
10.3 设备对象 304
10.3.1 设备对象的定义 304
10.3.2 设备对象的命名 304
10.3.3 设备对象的类型 305
10.3.4 设备对象的设备扩展 306
10.3.5 设备的打开操作 306
10.3.6 设备命名策略 307
10.4 设备的中断管理 308
10.5 设备管理实例:串口通信程序 309
10.5.1 串行通信接口概述 309
10.5.2 串行通信编程方式 312
10.6 设备驱动程序管理总结 334
第11章 图形用户界面 336
11.1 图形用户界面概述 336
11.2 符合VESA标准的显示卡操作方法 337
11.2.1 判断显示卡是否支持VBE标准 338
11.2.2 切换到0x118工作模式 339
11.3 对显示设备的封装—Video对象 342
11.3.1 GUI模块的分层架构 342
11.3.2 Video对象 343
11.3.3 通用绘制层简介 349
11.4 鼠标指针的实现 351
11.5 窗口消息传递机制概述 354
11.6 Hello China的窗口机制 355
11.6.1 父窗口要完全包含子窗口 355
11.6.2 二层窗口剪切域 357
11.6.3 二层窗口剪切域的实现 358
11.7 Hello China窗口机制的实现 360
11.7.1 窗口管理器与窗口对象 361
11.7.2 窗口函数与窗口消息 363
11.7.3 窗口归属线程 366
11.7.4 窗口树 366
11.8 用户输入处理和消息传递 369
11.8.1 用户输入和消息传递过程简介 369
11.8.2 设备驱动程序的工作 372
11.8.3 设备输入管理器 379
11.8.4 GUI原始输入线程—GUIRAWIT 383
11.8.5 消息循环的本质 388
11.8.6 应用线程之间的窗口消息交互 392
11.9 Hello China的GUI Shell 393
11.9.1 GUI Shell概述 393
11.9.2 GUI Shell的启动和初始化 395
11.9.3 加载一个应用程序 399
11.9.4 GUI Shell的退出 400
11.10 GUI模块的开发方法 402
第12章 文件系统及其实现 404
12.1 文件系统概述 404
12.1.1 文件系统的基本概念 404
12.1.2 文件系统的操作——fs程序 405
12.2 FAT32文件系统原理 406
12.2.1 FAT32卷的布局 406
12.2.2 引导扇区和BPB 407
12.2.3 文件分配表 408
12.2.4 文件目录项 410
12.2.5 文件的查找 411
12.3 Hello China文件系统的实现 412
12.3.1 IO管理器 412
12.3.2 文件系统的加载和初始化 418
12.3.3 存储设备驱动程序 419
12.3.4 分区的识别和安装 426
12.3.5 文件的打开操作 431
12.3.6 文件的读取操作 434
12.4 文件系统API的使用举例 437
12.5 文件系统实现总结 439
第13章 应用程序开发方法 441
13.1 概述 441
13.2 HCX文件的结构和加载过程 441
13.2.1 HCX文件的格式 441
13.2.2 HCX文件的生成方式 442
13.2.3 HCX文件的加载和执行 443
13.3 Hello China应用程序开发步骤 444
13.3.1 建立应用程序开发环境 444
13.3.2 启动VS 2008,建立一个新的应用程序 444
13.3.3 在应用程序中添加源代码 444
13.3.4 对新建的应用程序进行设置 446
13.3.5 编写应用程序代码,并进行编译链接 448
13.3.6 对生成的DLL进行处理,形成HCX文件 450
13.3.7 运行生成的HCX文件 451
13.4 应用程序开发总结 452
第14章 开发辅助工具 453
14.1 开发辅助工具概述 453
14.2 PE文件格式简介 453
14.2.1 MS-DOS头和DOS stub程序 454
14.2.2 PE文件头 455
14.2.3 PE文件中的节 458
14.3 开发辅助工具的实现和使用 460
14.3.1 process工具 460
14.3.2 hcxbuild工具 461
14.3.3 append工具 463
14.3.4 vfmaker工具 464
14.3.5 dumpf32和mkntfsbs工具 464
附录 465
附录A 关于操作系统开发的两篇博文 465
A.1 操作系统开发过程应遵循的一些原则 465
A.2 对操作系统开发的一些相关问题的思考 469
附录B 源代码组织结构说明 473
附录C 内核开发环境的搭建 476
C.1 概述 476
C.2 Microsoft Visual C++的设置 479
C.3 操作系统开发中常用的Microsoft Visual C++特性 479
C.4 搭建操作系统开发环境 480
C.5 操作系统核心模块开发示例 482
参考文献 485