第1章 Mac OS X起源 1
1.1 Apple对操作系统的探求 1
1.1.1 Star Trek 2
1.1.2 Raptor 2
1.1.3 NuKernel 3
1.1.4 TalOS 3
1.1.5 Copland 3
1.1.6 Gershwin 5
1.1.7 BeOS 5
1.1.8 A计划 6
1.2 NeXT篇章 7
1.2.1 NEXTSTEP 7
1.2.2 OpenStep 10
1.3 Mach因素 11
1.3.1罗切斯特智能网关 11
1.3.2 Accent 12
1.3.3 Mach 13
1.3.4 MkLinux 16
1.3.5音乐名称 17
1.4战略 17
1.4.1 Mac OS 8和Mac OS 9 18
1.4.2 Rhapsody 20
1.5朝着Mac OS X前进 22
1.5.1 Mac OS X Server 1.x 23
1.5.2 Mac OS X Developer Previews 23
1.5.3 Mac OS X Public Beta版本 24
1.5.4 Mac OS X 10.x 25
第2章 Mac OS X概述 30
2.1固件 31
2.2引导加载程序 32
2.3 Darwin 32
2.3.1 Darwin程序包 32
2.3.2 Darwin的优点 33
2.3.3 Darwin和Mac OS X 33
2.4 xnu内核 33
2.4.1 Mach 34
2.4.2 BSD 35
2.4.3 I/O Kit 36
2.4.4 libkern库 37
2.4.5 libsa库 38
2.4.6 Platform Export 38
2.4.7内核扩展 39
2.5文件系统的用户空间视图 39
2.5.1文件系统域 40
2.5.2 /System/Library/目录 40
2.6运行时体系结构 42
2.6.1 Mach-O文件 43
2.6.2胖二进制文件 45
2.6.3链接 48
2.7 C库 52
2.8捆绑组件和框架 54
2.8.1捆绑组件 54
2.8.2属性列表文件 58
2.8.3框架 59
2.8.4预绑定 62
2.9 Core Services 64
2.10应用程序服务 65
2.10.1图形和多媒体服务 65
2.10.2其他应用程序服务 72
2.11应用程序环境 73
2.11.1 BSD 73
2.11.2 X Window System 74
2.11.3 Carbon 74
2.11.4 Cocoa 76
2.11.5 WebObjects 81
2.11.6 Java 81
2.11.7 QuickTime 82
2.11.8 Classic 82
2.11.9 Rosetta 83
2.12用户界面 84
2.12.1可视化效果 84
2.12.2与分辨率无关的用户界面 85
2.12.3效率特性 85
2.12.4通用访问支持 86
2.13编程 87
2.13.1 Xcode 87
2.13.2编译器和库 89
2.13.3解释器 89
2.13.4工具 92
2.14安全 94
2.14.1内核空间的安全 95
2.14.2用户空间的安全 96
2.14.3系统管理 100
2.14.4审计系统 103
2.15 Mac OS X Server 105
2.15.1 Xgrid 105
2.15.2 Xsan 108
2.16网络 111
第3章 Apple内幕 112
3.1 Power Mac G5 113
3.1.1 U3H系统控制器 113
3.1.2 K2 I/O设备控制器 114
3.1.3 PCI-X和PCI Express 115
3.1.4 HyperTransport 117
3.1.5 Elastic I/O互连 118
3.2 G5:血统和路线图 120
3.2.1 G5的基本方面 121
3.2.2新一代POWER 122
3.2.3 PowerPC 970、970FX和970MP 123
3.2.4 Intel Core Duo 125
3.3 PowerPC 970FX 125
3.3.1基本知识 125
3.3.2缓存 126
3.3.3内存管理单元(MMU) 130
3.3.4各式各样的内部缓冲区和队列 133
3.3.5预取 134
3.3.6寄存器 135
3.3.7重命名寄存器 141
3.3.8指令集 142
3.3.9 970FX核心 146
3.3.10 AltiVec 153
3.3.11电源管理 158
3.3.12 64位体系结构 160
3.3.13软补丁功能 161
3.4软件约定 161
3.4.1字节序 162
3.4.2寄存器使用 163
3.4.3栈使用 166
3.4.4函数形参和返回值 172
3.5示例 173
3.5.1递归阶乘函数 174
3.5.2原子式比较和存储函数 177
3.5.3函数重定向 179
3.5.4 970FX的周期精确的模拟 188
第4章 固件和引导加载程序 193
4.1简介 193
4.1.1固件的种类 194
4.1.2优先存储 194
4.2全新的世界 195
4.2.1“新”是好消息 196
4.2.2现代的Boot ROM(PowerPC) 197
4.3上电复位 199
4.4 Open Firmware 199
4.4.1与Open Firmware交互 200
4.4.2 Open Firmware仿真器 204
4.5 Forth 204
4.5.1基本单元 204
4.5.2栈 204
4.5.3字 205
4.5.4字典 206
4.5.5调试 212
4.6设备树 213
4.6.1属性 216
4.6.2方法 220
4.6.3数据 220
4.7 Open Firmware接口 221
4.7.1用户接口 222
4.7.2客户接口 222
4.7.3设备接口 222
4.8编程示例 222
4.8.1转储NVRAM内容 223
4.8.2确定屏幕尺寸 224
4.8.3处理颜色 224
4.8.4绘制颜色填充的矩形 225
4.8.5创建“汉诺塔”问题的动画式解决方案 226
4.8.6创造和使用鼠标指针 236
4.8.7窃取字体 239
4.8.8实现时钟 241
4.8.9绘制图像 242
4.8.10创建窗口 243
4.9固件引导序列 244
4.9.1脚本 246
4.9.2锁键 246
4.10 BootX 247
4.10.1文件格式 247
4.10.2结构 249
4.10.3操作 249
4.11备用的引导方案 257
4.11.1引导备用内核 257
4.11.2从软件RAID设备引导 259
4.11.3通过网络引导 262
4.12固件安全 264
4.12.1管理固件安全 264
4.12.2找回Open Firmware密码 266
4.13启动内核 266
4.14 BootCache优化 267
4.15 引导时的内核参数 268
4.16 EFI 273
4.16.1遗留的伤痛 273
4.16.2新的开始 275
4.16.3 EFI 276
4.16.4 EFI的抽样 278
4.16.5 EFI的好处 285
第5章 内核和用户级启动 287
5.1安排内核执行 287
5.1.1异常和异常矢量 288
5.1.2内核符号 290
5.1.3运行内核 291
5.2低级处理器初始化 292
5.2.1每个处理器的数据 292
5.2.2复位类型 296
5.2.3处理器类型 298
5.2.4内存补丁 301
5.2.5特定于处理器的初始化 303
5.2.6其他早期的初始化 304
5.3高级处理器初始化 307
5.3.1在虚拟内存之前 308
5.3.2低级虚拟内存初始化 311
5.3.3在虚拟内存之后 316
5.4 Mach子系统初始化 320
5.4.1调度器初始化 322
5.4.2高级虚拟内存子系统初始化 322
5.4.3 IPC初始化 327
5.4.4完成VM和IPC初始化 327
5.4.5初始化其他的子系统 328
5.4.6任务和线程 328
5.4.7启动内核自举线程 329
5.5第一个线程 329
5.6 I/O Kit初始化 331
5.7 BSD初始化 338
5.7.1其他的BSD初始化(第1部分) 339
5.7.2文件系统初始化 341
5.7.3其他的BSD初始化(第2部分) 342
5.7.4网络子系统初始化 343
5.7.5其他的BSD初始化(第3部分) 346
5.7.6挂接根文件系统 348
5.7.7创建进程1 355
5.7.8共享内存区域 357
5.8启动第一个用户空间的程序 359
5.9从处理器 360
5.10用户级启动 362
5.10.1 launchd 362
5.10.2多用户启动 374
5.10.3单用户启动 382
5.10.4安装启动 382
第6章 xnu内核 386
6.1 xnu源 386
6.2 Mach 391
6.2.1内核基础 392
6.2.2异常处理 396
6.3 Mach API的性质 397
6.3.1显示主机信息 397
6.3.2访问内核的时钟服务 399
6.3.3使用时钟服务发出警报 402
6.3.4显示主机统计信息 404
6.4进入内核 407
6.4.1控制转移的类型 408
6.4.2实现系统进入机制 410
6.5异常处理 418
6.5.1硬件中断 423
6.5.2各种陷阱 424
6.5.3系统调用 426
6.6系统调用处理 426
6.7系统调用类别 429
6.7.1 BSD系统调用 429
6.7.2 Mach陷阱 446
6.7.3 I/O Kit陷阱 453
6.7.4仅支持PowerPC的系统调用 453
6.7.5超快陷阱 454
6.7.6公共页 460
6.8对调试、诊断和跟踪的内核支持 467
6.8.1 GDB(基于网络或者基于FireWire的调试) 467
6.8.2 KDB(基于串行线路的调试) 468
6.8.3 CHUD支持 470
6.8.4内核分析(kgmon和gprof) 476
6.8.5每个进程的内核跟踪(ktrace(2)和kdump) 480
6.8.6审计支持 482
6.8.7细粒度的内核事件跟踪(kdebug) 486
6.8.8低级诊断和调试接口 499
6.8.9低级内核跟踪 508
6.9虚拟机监视器 516
6.9.1特性 517
6.9.2使用VMM设施 518
6.9.3示例:在虚拟机中运行代码 519
6.10编译内核 533
6.10.1获取必要的程序包 533
6.10.2编译必要的程序包 534
6.10.3编译xnu程序包 536
6.10.4 DarwinBuild 536
第7章 进程 538
7.1进程:从早期的UNIX到Mac OS X 538
7.1.1 Mac OS X进程限制 539
7.1.2 Mac OS X执行风格 540
7.2 Mach抽象、数据结构和API 541
7.2.1关系总结 542
7.2.2处理器集 542
7.2.3处理器 544
7.2.4任务和任务API 553
7.2.5线程 555
7.2.6线程相关的抽象 561
7.3新系统的许多线程 571
7.3.1 Mach任务和线程 572
7.3.2 BSD进程 592
7.3.3 POSIX线程(Pthreads) 602
7.3.4 Java线程 604
7.3.5 Cocoa中的NSTask类 605
7.3.6 Cocoa中的NSThread类 606
7.3.7 Carbon Process Manager 609
7.3.8 Carbon Multiprocessing Services 611
7.3.9 Carbon Thread Manager 613
7.4调度 616
7.4.1调度基础设施初始化 616
7.4.2调度器操作 628
7.4.3调度策略 639
7.5 execve()系统调用 647
7.5.1 Mach-O二进制文件 650
7.5.2胖(通用)二进制文件 658
7.5.3解释器脚本 658
7.6启动应用程序 660
7.6.1把实体映射到处理程序 660
7.6.2统一类型标识符 662
第8章 内存 665
8.1回顾 665
8.1.1虚拟内存和UNIX 665
8.1.2虚拟内存和个人计算 666
8.1.3 Mac OS X虚拟内存子系统的根源 666
8.2 Mac OS X内存管理概览 667
8.2.1从用户空间中读取内核内存 669
8.2.2查询物理内存大小 673
8.3 Mach VM 674
8.3.1概述 674
8.3.2任务地址空间 676
8.3.3 VM映射 677
8.3.4 VM映射条目 677
8.3.5 VM对象 677
8.3.6分页器 679
8.3.7写时复制 685
8.3.8物理映射(pmap) 687
8.4驻留内存 690
8.4.1 vm_page结构 690
8.4.2搜索驻留页 691
8.4.3驻留页队列 692
8.4.4页置换 692
8.4.5物理内存簿记 693
8.4.6页错误 696
8.5自举期间的虚拟内存初始化 697
8.6 Mach VM用户空间的接口 698
8.6.1 mach_vm_map() 700
8.6.2 mach_vm_remap() 703
8.6.3 mach_vm_allocate() 703
8.6.4 mach_vm_deallocate() 703
8.6.5 mach_vm_protect() 704
8.6.6 mach_vm_inherit() 704
8.6.7 mach_vm_read() 704
8.6.8 mach_vm_write() 705
8.6.9 mach_vm_copy() 706
8.6.10 mach_vm_wire() 706
8.6.11 mach_vm_behavior_set() 706
8.6.12 mach_vm_msync() 708
8.6.13统计 709
8.7使用Mach VM接口 710
8.7.1控制内存继承 710
8.7.2调试Mach VM子系统 713
8.7.3保护内存 714
8.7.4访问另一个任务的内存 715
8.7.5命名和共享内存 718
8.8内核和用户地址空间布局 724
8.9通用页列表(UUL) 726
8.10统一缓冲区缓存(UBC) 727
8.10.1 UBC接口 729
8.10.2 NFS缓冲区缓存 730
8.11动态分页器程序 732
8.12更新守护进程 734
8.13系统共享内存 735
8.13.1共享内存的应用 735
8.13.2 Shared Memory Server子系统的实现 738
8.13.3动态链接器的共享目标文件加载 742
8.13.4通过系统应用程序使用shared_region_map_file_np() 745
8.13.5关于预绑定的注释 751
8.14任务工作集检测和维护 752
8.14.1 TWS机制 752
8.14.2 TWS实现 753
8.15 用户空间中的内存分配 757
8.15.1历史性突破 757
8.15.2内存分配器内幕 759
8.15.3 malloc()例程 771
8.15.4最大的单个分配(32位) 773
8.15.5最大的单个分配(64位) 774
8.15.6枚举所有指针 775
8.15.7显示可伸缩区域的统计信息 778
8.15.8记录malloc操作 780
8.15.9实现malloc层 783
8.16内核中的内存分配 784
8.16.1页级分配 784
8.16.2 kmem_alloc 787
8.16.3 Mach区域分配器 788
8.16.4 kalloc函数家族 794
8.16.5 OSMalloc函数家族 795
8.16.6 I/O Kit中的内存分配 796
8.16.7内核的BSD部分的内存分配 799
8.16.8 libkem的C++环境中的内存分配 801
8.17内存映射的文件 802
8.18 64位计算 809
8.18.1引入64位计算的原因 810
8.18.2 Mac OS X 10.4:64位用户地址空间 813
8.18.3为什么不使用64位的可执行文件 817
8.18.4 64位“场景” 817
第9章 进程间通信 818
9.1简介 818
9.1.1 IPC的演化 819
9.1.2 Mac OS X中的IPC 820
9.2 Mach IPC:概述 821
9.2.1 Mach端口 822
9.2.2 Mach IPC消息 825
9.3 Mach IPC:Mac OS X实现 832
9.3.1 IPC空间 833
9.3.2 Mach端口的构成 835
9.3.3任务和IPC 838
9.3.4线程和IPC 840
9.3.5端口分配 841
9.3.6消息传递实现 846
9.3.7 IPC子系统初始化 848
9.4名称服务器和自举服务器 850
9.4.1网络消息服务器 850
9.4.2自举服务器 851
9.4.3自举服务器API 854
9.5使用Mach IPC 864
9.5.1简单的客户-服务器示例 865
9.5.2死名 869
9.5.3端口集 870
9.5.4介入 872
9.5.5传输页外内存和端口权限 874
9.6 MIG 878
9.6.1 MIG规范文件 879
9.6.2使用MIG创建客户-服务器系统 882
9.6.3内核中的MIG 890
9.7 Mach异常 893
9.7.1 Mach的异常处理设施的程序员可见的方面 895
9.7.2 Mach异常处理链 898
9.7.3示例:Mach异常处理程序 902
9.8信号 908
9.8.1可靠性 909
9.8.2信号的数量 910
9.8.3应用程序定义的信号 910
9.8.4异步I/O的基于信号的通知 910
9.8.5信号和多线程 913
9.8.6信号动作 913
9.8.7信号生成和递送 915
9.8.8 Mach异常与UNIX信号共存 917
9.8.9异常、信号和调试 919
9.8.10 ptrace()系统调用 920
9.9管道 920
9.10命名管道(fifo) 921
9.11文件描述符传递 922
9.12 XSI IPC 929
9.13 POSIX IPC 929
9.13.1 POSIX信号量 930
9.13.2 POSIX共享内存 934
9.14 Distributed Objects 938
9.15 Apple Events 945
9.15.1在AppleScript中使用Apple Events平铺应用程序窗口 947
9.15.2在C程序中构建和发送Apple Event 949
9.15.3通过发送AppleEvent导致系统睡眠 951
9.16通知 953
9.16.1 Foundation通知 953
9.16.2 notify(3)API 956
9.16.3内核事件通知机制(kqueue(2)) 963
9.16.4 Core Foundation通知 967
9.16.5 fsevents 967
9.16.6 kauth 967
9.17 Core Foundation IPC 967
9.17.1通知 968
9.17.2运行循环 971
9.18同步 980
9.18.1用于原子操作的接口 981
9.18.2低级锁定 982
9.18.3 BSD条件变量 985
9.18.4 Mach锁集 986
9.18.5 Mach信号量 986
9.18.6 Pthreads同步接口 990
9.18.7 I/O Kit中的锁定 990
9.18.8漏斗 991
9.18.9 SPL 996
9.18.10劝告模式的文件锁定 996
第10章 扩展内核 999
10.1沿着内存通道的驱动程序 999
10.1.1驱动程序编程被认为是困难的 999
10.1.2良好的继承 999
10.1.3一切都是文件 1000
10.1.4扩展内核不仅仅是驱动设备 1000
10.2 I/O Kit 1000
10.2.1嵌入式C++ 1002
10.2.2 I/O Kit类层次结构 1003
10.2.3 I/O Kit家族 1004
10.2.4 I/O Kit驱动程序 1005
10.2.5结点 1006
10.2.6一般I/O Kit类 1006
10.2.7工作循环 1008
10.2.8 I/O Registry 1013
10.2.9 I/O Catalog 1014
10.2.10 I/O Kit初始化 1014
10.2.11 I/O Kit中的驱动程序匹配 1016
10.3 DART 1017
10.4动态扩展内核 1018
10.4.1内核扩展的结构 1018
10.4.2内核扩展的创建 1019
10.4.3内核扩展的管理 1024
10.4.4内核扩展的自动加载 1025
10.5与内核通信 1026
10.6创建内核扩展 1027
10.6.1通用内核扩展 1027
10.6.2使用通用kext实现sysctl变量 1031
10.6.3 I/O Kit设备驱动程序kext 1035
10.7 I/O Kit功能的编程之旅 1042
10.7.1旋转帧缓冲区 1042
10.7.2访问帧缓冲区内存 1046
10.7.3获取固件变量的列表 1048
10.7.4获取关于加载的内核扩展的信息 1049
10.7.5从SMS获取加速计数据 1051
10.7.6列出PCI设备 1055
10.7.7获取计算机的序号和型号信息 1056
10.7.8获取温度传感器读数 1057
10.7.9获取以太网接口的MAC地址 1060
10.7.10实现一种加密式磁盘过滤方案 1062
10.8调试 1073
10.8.1内核恐慌 1073
10.8.2远程核心转储 1074
10.8.3日志记录 1075
10.8.4使用GDB进行调试 1078
10.8.5使用KDB进行调试 1080
10.8.6各种各样的调试工具 1085
10.8.7 stabs 1086
第11章 文件系统 1092
11.1磁盘和分区 1092
11.1.1 Apple分区方案 1095
11.1.2 PC风格的分区 1097
11.1.3基于GUID的分区 1098
11.2 DiskArbitration 1098
11.2.1获取磁盘的描述 1100
11.2.2参与磁盘挂接决策 1102
11.2.3从I/O Kit接收媒体通知 1103
11.3磁盘设备的实现 1106
11.4磁盘映像 1110
11.4.1使用hdiutil程序 1110
11.4.2 RAM磁盘 1113
11.4.3 BSD虚拟结点磁盘驱动程序 1113
11.4.4从头开始创建虚拟磁盘 1114
11.5文件和文件描述符 1116
11.6 VFS层 1118
11.7文件系统类型 1127
11.7.1 HFS+和HFS 1128
11.7.2 ISO 9660 1129
11.7.3 MS-DOS 1130
11.7.4 NTFS 1131
11.7.5 UDF 1131
11.7.6 UFS 1131
11.7.7 AFP 1133
11.7.8 FTP 1134
11.7.9 NFS 1135
11.7.10 SMB/CIFS 1135
11.7.11 WebDAV 1136
11.7.12 cddafs 1136
11.7.13 deadfs 1138
11.7.14 devfs 1139
11.7.15 fdesc 1139
11.7.16 specfs和fifofs 1140
11.7.17 synthfs 1141
11.7.18联合 1142
11.7.19 volfs 1144
11.8 Spotlight 1145
11.8.1 Spotlight的体系结构 1146
11.8.2 fsevents机制 1151
11.8.3导入元数据 1163
11.8.4查询Spotlight 1165
11.8.5 Spotlight命令行工具 1173
11.8.6克服粒度限制 1173
11.9访问控制列表 1175
11.10 kauth授权子系统 1178
11.10.1 kauth概念 1179
11.10.2实现 1182
11.10.3虚拟结点级文件系统活动监视器 1184
第12章 HFS+文件系统 1201
12.1分析工具 1202
12.1.1 HFSDebug 1202
12.1.2用于获取文件系统基本属性的接口 1204
12.1.3 Mac OS X命令行工具 1204
12.1.4 HFS+源和技术说明TN 1150 1204
12.2基本概念 1205
12.2.1卷 1205
12.2.2分配块 1206
12.2.3区段 1206
12.2.4文件分支 1207
12.2.5簇 1208
12.2.6 B树 1208
12.3 HFS+卷的结构 1215
12.4保留区域 1216
12.5卷头 1217
12.5.1查看卷头 1217
12.5.2查看卷控制块 1222
12.6 HFS包装器 1223
12.7特殊文件 1226
12.7.1分配文件 1226
12.7.2编目文件 1230
12.7.3区段溢出文件 1237
12.7.4基本属性文件 1242
12.7.5启动文件 1247
12.8检查HFS+特性 1247
12.8.1大小写敏感性 1247
12.8.2文件名编码 1249
12.8.3权限 1250
12.8.4日志记录 1254
12.8.5配额 1260
12.8.6硬链接 1261
12.8.7解除链接打开的文件 1265
12.8.8符号链接 1266
12.8.9别名 1267
12.8.10资源分支 1268
12.9优化 1270
12.9.1即时的碎片整理 1270
12.9.2元数据区域 1273
12.9.3热文件群集 1274
12.10其他各种特性 1280
12.10.1特殊的系统调用 1280
12.10.2冻结和解冻卷 1280
12.10.3扩展和收缩卷 1281
12.10.4卷通知 1281
12.10.5对稀疏设备的支持 1283
12.11 比较Mac OSX文件系统 1284
12.12比较HFS+与NTFS 1290
附录A 基于x86的Macintosh计算机上的Mac OS X 1293
A.1硬件区别 1293
A.2固件和引导 1294
A.3分区 1295
A.4通用二进制文件 1296
A.5 Rosetta 1297
A.6字节序 1299
A.7其他各种改变 1299
A.7.1无双重映射的内核地址空间 1299
A.7.2不可执行的栈 1299
A.7.3线程创建 1300
A.7.4系统调用 1301
A.7.5没有/dev/mem或/dev/kmem 1302
A.7.6新的I/O Kit平面 1302