第1章 操作系统原理 1
1.1操作系统的作用 3
1.2进程管理 3
1.3进程地址空间 4
1.4操作系统服务 5
1.5虚拟内存 6
1.6调度 8
1.7硬件和驱动程序 9
1.8小结 11
第2章Mac OS X和iOS 12
2.1 XNU内核 17
2.1.1内核扩展(KEXT) 18
2.1.2 Mach 18
2.1.3 BSD层 27
2.1.4 I/O Kit 29
2.2小结 31
第3章Xcode和内核开发环境 32
3.1语言的选择:C++ 32
3.2 Xcode 33
3.3 “Hello World”内核扩展 34
3.4加载和卸载内核扩展 37
3.5使用控制台查看输出 39
3.6小结 40
第4章I/O Kit框架 41
4.1 I/O Kit模型 41
4.2对象关系 43
4.3 Info.plist文件 43
4.3.1驱动程序类 46
4.3.2 IORegistryExplorer 50
4.4内核库:libkern 52
4.4.1 OSObject 52
4.4.2容器类 54
4.5小结 56
第5章 应用程序与驱动程序的交互 57
5.1 I/O Kit框架 58
5.2查找驱动程序 58
5.3观察设备移除 63
5.4修改设备驱动程序属性 65
5.5基于状态的交互 68
5.6驱动程序的通知 79
5.7小结 83
第6章 内存管理 84
6.1内存类型 84
6.1.1 CPU物理地址 85
6.1.2总线物理地址 85
6.1.3用户和内核虚拟地址 85
6.1.4内存顺序:大端序和小端序 86
6.1.5 32位和64位内存寻址 87
6.2内存分配 88
6.2.1底层分配机制 89
6.2.2 Mach内存域分配器 89
6.2.3 kalloc家族 89
6.2.4 BSD中的内存分 90
6.2.5 I/O Kit内存分配 91
6.2.6使用C++的new操作符分配内存 92
6.3内存描述符 92
6.3.1 IOBufferMemoryDescriptor 94
6.3.2其他的内存描述符 95
6.4映射内存 95
6.4.1用户空间任务到内核空间的内存映射 95
6.4.2IOMemoryMap类 97
6.4.3内核到用户空间任务的内存映射 98
6.4.4将内存映射到指定的用户空间任务 99
6.4.5物理地址映射 100
6.5小结 101
第7章 同步和线程 102
7.1同步原语 102
7.2原子操作 104
7.3锁 107
7.3.1自旋锁 107
7.3.2互斥 109
7.3.3条件变量 110
7.3.4读/写互斥 112
7.4同步异步事件:工作环 113
7.4.1 IOCommandGate 115
7.4.2定时器 116
7.4.3释放工作环 117
7.5内核线程 118
7.6小结 119
第8章USB 120
8.1 USB体系结构 120
8.1.1 USB传输速度 122
8.1.2主机控制器 123
8.1.3 USB协议 124
8.1.4端点 126
8.1.5 USB描述符 126
8.1.6 USB设备类 127
8.2 I/O Kit USB支持 128
8.2.1 USB设备和驱动程序处理 129
8.2.2加载USB驱动程序 130
8.2.3 USB Prober 132
8.2.4驱动程序示例:USB大容量存储器设备驱动程序 133
8.2.5驱动程序启动 138
8.2.6处理设备移除 138
8.2.7枚举接口 139
8.2.8枚举端点 140
8.2.9执行设备请求 141
8.2.10执行批量端点和中断端点的I/O 144
8.3小结 147
第9章PCI Express和Thunderbolt 148
9.1 I/O Kit中的PCI 150
9.1.1匹配和加载驱动程序 151
9.1.2驱动程序示例:一个简单的PCI驱动程序 154
9.1.3访问配置空间寄存器 156
9.1.4 PCI I/O内存区 158
9.1.5处理设备移除 161
9.2中断 162
9.2.1 I/O Kit中断机制 163
9.2.2注册接收中断 164
9.2.3启用MSI 166
9.2.4处理主中断 166
9.2.5处理二级中断 168
9.3直接内存访问 168
9.3.1将物理地址转换为总线地址 170
9.3.2为DMA准备内存 171
9.3.3建立分散/聚集列表 172
9.3.4IODMACommand类 173
94小结 175
第10章 电源管理 177
10.1响应电源状态改变 179
10.2请求电源状态改变 184
10.3处理设备空闲 185
10.4观察设备电源状态改变 186
10.5汇总 187
10.6小结 191
第11章 串行端口驱动程序 192
11.1 Mac OSX串行端口体系结构概览 192
11.2串行端口驱动程序 194
11.3实现IOSerialDriverSync类 197
11.4串行端口状态 200
11.5串行端口事件 204
11.6串行数据传输 207
11.7从用户空间访问串行端口 211
11.8小结 214
第12章 音频驱动程序 215
12.1数字音频和音频设备简介 215
12.2 Core Audio 217
12.3 I/O Kit音频支持 218
12.4实现一个音频驱动程序 219
12.4.1驱动程序和硬件初始化 221
12.4.2注册音频控制 223
12.4.3实现音频引擎 225
12.4.4 I/O引擎初始化 226
12.4.5其他的音频引擎功能 235
12.5小结 236
第13章 网络 238
13.1网络内核扩展 242
13.1.1内核控制KPI 242
13.1.2套接字过滤器 242
13.1.3因特网协议过滤器 250
13.1.4接口过滤器 255
13.2调试和测试网络扩展 258
13.3 I/O Kit中的网络 259
13.3.1构建简单以太网控制器驱动程序 261
13.3.2 MyEthernetDriver设计 262
13.3.3驱动程序初始化和启动 264
13.3.4介质和状态选择 266
13.3.5配置设备硬件地址 268
13.3.6启用和禁用设备 268
13.3.7传输网络分组 270
13.3.8接收分组 271
13.3.9对MyEthernetDriver进行测试 274
13.4小结 276
第14章 存储系统 277
14.1传输层驱动程序 278
14.2 IOBlockStorageDevice接口 279
14.3构建RAM磁盘设备 282
14.4分区规则 292
14.4.1实现一个示例分区规则 293
14.4.2媒介内容线索属性 300
14.5媒介过滤器驱动程序 300
14.5.1加密过滤器规则示例 302
14.5.2创建一个自定义GUID分区表 306
14.6小结 308
第15章 用户空间USB驱动程序 310
15.1背景 310
15.2 IOUSBLib框架 311
15.3处理异步操作 315
15.4 IOUSBDeviceInterface类 316
15.5 IOUSBInterfaceInterface类 320
15.5.1属性方法 321
15.5.2端点数据传输方法 322
15.5.3低延迟同步传输 328
15.6小结 330
第16章 调试 331
16.1常见的问题类型 331
16.2内核恐慌 332
16.3调试机制 333
16.3.1启动时修复崩溃 335
16.3.2采用IOLog()追踪 335
16.3.3输出栈跟踪 336
16.3.4通过FireWire远程跟踪 337
16.3.5远程内核核心转储 339
16.3.6 KDB 340
16.3.7通过以太网或FireWire使用GDB远程调试 340
16.3.8实时调试运行的内核 344
16.3.9使用虚拟机调试 344
16.3.10在内核中使用GDB调试 344
16.3.11使用Activity Monitor诊断挂起进程 354
16.3.12查找内存和资源泄漏 355
16.4小结 356
第17章 高级内核编程 357
17.1内核中的SSE和浮点 357
17.2多功能驱动程序 358
17.3编写I/O Kit族 358
17.4内核控制KPI 359
17.4.1内核控制注册 361
17.4.2客户端连接 362
17.4.3获取和设置选项 363
17.4.4从用户空间访问内核控制 364
17.5内核中的进程处理 365
17.6加载资源 366
17.7 KEXT资源之外的内容 367
17.8内核驱动程序通知 368
17.9小结 371
第18章 部署 372
18.1安装和加载内核扩展 372
18.2加载首选项和设置 374
18.3内核扩展的版本管理 375
18.4测试和品质保证 375
18.5打包KEXT和软件 376
18.5.1构建Hello World内核扩展安装包 378
18.5.2将内容添加至安装包 378
18.5.3配置安装包 379
18.5.4构建安装包 382
18.5.5卸载安装包 383
18.6小结 383
索引 385