《深入解析Mac OS XiOS操作系统》PDF下载

  • 购买积分:20 如何计算积分?
  • 作  者:(美)JONATHANLEVIN著;郑思遥,房佩慈译
  • 出 版 社:北京:清华大学出版社
  • 出版年份:2014
  • ISBN:9787302348672
  • 页数:713 页
图书介绍:本书由苹果系统专家执笔,深入Mac OS X和iOS的内部,剖析苹果系统的内核及本质,并详解各种内核工具的用法。内容包括内核的任务和基本组成、进程管理和调度、内存管理、虚拟内存、锁与进程间通信、模块、虚拟文件系统、网络、系统调用、内核活动、时间管理、页缓存和块缓存、数据同步、页面收回和交换、审计等主题。

第Ⅰ部分 高级用户指南 3

第1章 达尔文主义:OS X的进化史 3

1.1前达尔文时代:Mac OS Classic 3

1.2浪子回头:NeXTSTEP 4

1.3走进新时代:OS X操作系统 4

1.4迄今为止的所有OS X版本 5

1.4.1 10.0——Cheetah,初出茅庐 5

1.4.2 10.1——Puma,更强大 5

1.4.3 10.2——Jaguar,渐入佳境 6

1.4.4 10.3—— Panther和Safari 6

1.4.5 10.4——Tiger,转投Intel的怀抱 6

1.4.6 10.5—— Leopard和UNIX 6

1.4.7 10.6——Snow Leopard 7

1.4.8 10.7——Lion 7

1.4.9 10.8——Mountain Lion 8

1.5 iOS——走向移动平台的OS X 9

1.5.1 1.x——Heavenly,第一代iPhone 9

1.5.2 2.x——App Store、3G和企业级的特性 10

1.5.3 3.x——告别第一代,迎来iPad 10

1.5.4 4.x—— iPhone 4.Apple TV和iPad 2 10

1.5.5 5.x—— iPhone 4S和更新的硬件 11

1.5.6 iOS和OS X对比 11

1.6 OS X的未来 13

1.7本章小结 14

参考文献 15

第2章 合众为一:OS X和iOS的架构 17

2.1 OS X架构概述 17

2.2用户体验层 19

2.2.1 Aqua 19

2.2.2 QuickLook 20

2.2.3 Spotlight 21

2.3 Darwin—— UNIX核心 22

2.3.1 Shell 22

2.3.2文件系统 23

2.4 UNIX的系统目录 23

2.4.1 OS X特有的目录 24

2.4.2 iOS文件系统的区别 25

2.5 bundle 25

2.6应用程序和app 26

2.6.1 Info.plist 27

2.6.2 Resources目录 29

2.6.3 NIB文件 29

2.6.4通过.lproj文件实现国际化 30

2.6.5图标文件(.icns) 30

2.6.6 CodeResources 30

2.7框架 33

2.7.1框架bundle格式 33

2.7.2 OS X和iOS公共框架列表 35

2.8库 41

2.9其他应用程序类型 43

2.9.1 Java(仅限于OS X) 43

2.9.2 Widget 43

2.9.3 BSD/Mach原生程序 44

2.10系统调用 44

2.10.1 POSLX 44

2.10.2 Mach系统调用 45

2.11 XNU概述 47

2.11.1 Mach 47

2.11.2 BSD层 48

2.11.3 libkern 48

2.11.4 I/O Kit 48

2.12本章小结 48

参考文献 49

第3章 站在巨人的肩膀上:OS X和iOS使用的技术 51

3.1 BSD相关的特性 51

3.1.1 sysctl 51

3.1.2 kqueue 53

3.1.3审计(OS X) 54

3.1.4强制访问控制 57

3.2 OS X和iOS特有的技术 60

3.2.1用户和组的管理(OS X) 60

3.2.2系统配置 62

3.2.3记录日志 64

3.2.4 Apple事件和AppleScript 66

3.2.5 FSEvents 68

3.2.6通知 73

3.2.7其他重要的API 73

3.3 OS X和iOS的安全机制 73

3.3.1代码签名 74

3.3.2隔离机制(沙盒化) 75

3.3.3 Entitlement:更严格的沙盒 77

3.3.4沙盒机制的实施 82

3.4本章小结 83

参考文献 84

第4章 庖丁解进程:Mach-O格式、进程以及线程内幕 85

4.1关键概念回顾 85

4.1.1进程和线程 85

4.1.2进程生命周期 86

4.1.3 UNIX信号 89

4.2可执行文件 91

4.3通用二进制格式 92

4.3.1 Mach-O二进制格式 95

4.3.2加载命令 98

4.4动态库 104

4.4.1启动时库的加载 105

4.4.2库的运行时加载 113

4.4.3 dyld的特性 115

4.5进程地址空间 120

4.5.1进程入口点 120

4.5.2地址空间布局随机化 121

4.5.3 32位地址空间(Intel) 122

4.5.4 64位地址空间 123

4.5.5 32位地址空间(iOS) 123

4.6进程内存分配(用户态) 128

4.6.1 alloca() 128

4.6.2堆分配 128

4.6.3虚拟内存——系统管理员的角度 130

4.7线程 132

参考文献 134

第5章 进程跟踪和调试 135

5.1 DTrace 135

5.1.1 D语言 135

5.1.2 dtruss 138

5.1.3 DTrace工作原理 139

5.2其他剖析机制 142

5.2.1 CHUD的衰落 142

5.2.2继任者AppleProfileFamily 142

5.3进程信息 143

5.3.1 sysctl 143

5.3.2 proc info 144

5.4进程和系统快照 146

5.4.1 system_profiiler(8) 146

5.4.2 sysd agnose(1) 146

5.4.3 allmemory(1) 147

5.4.4 stackshot(1) 148

5.4.5 stack snapshot系统调用 149

5.5 kdebug 152

5.5.1基于kdebug的工具 152

5.5.2 kdebug代码 152

5.5.3写入kdebug消息 154

5.5.4读取kdebug消息 155

5.6应用程序崩溃 156

5.6.1应用程序挂起和采样 159

5.6.2内存破坏的bug 160

5.7内存泄漏 161

5.7.1 heap(1) 162

5.7.2 leaks(1) 162

5.7.3 malloc_ history(1) 163

5.8标准UNIX工具 163

5.8.1通过ps(I)列出进程列表 164

5.8.2 top(1):系统全局视图 164

5.8.3通过lsof 1)和fuser(1)进行文件诊断 165

5.9使用GDB 165

5.9.1 GDB的Darwin扩展 166

5.9.2 GDB用于iOS 166

5.9.3 LLDB 166

5.10本章小结 167

参考文献和深入阅读 167

第6章 引导过程:EFI和iBoot 169

6.1传统形式的引导 169

6.2揭秘EFI 171

6.2.1 E FI的基本概念 171

6.2.2 EFI服务 173

6.2.3 NVRAM变量 177

6.3 OS X和boot.efii 178

6.3.1 boot.efii的执行流程 179

6.3.2引导内核 185

6.3.3内核对 EFI的回调 187

6.3.4 Lion中boot.efi的变化 187

6.3.5 Boot Camp 187

6.3.6 bless(8) 188

6.4 iOS和iBoot 192

6.4.1初期:引导ROM 193

6.4.2普通引导 194

6.4.3恢复模式引导 195

6.4.4设备固件更新(DFU)模式 195

6.4.5降级和回放攻击 196

6.5安装镜像 196

6.5.1 OS X安装过程 196

6.5.2 iOS文件系统镜像(.ipsw文件) 201

6.6本章小结 206

参考文献和深入阅读 206

第7章 贯穿始终——Iaunchd 207

7.1 launchd 207

7.1.1启动launchd 207

7.1.2系统范围和用户范围的launchd 208

7.1.3守护程序和代理程序 208

7.1.4多面手launchd 209

7.2 LaunchDaemon列表 220

7.3 GUI shell程序 224

7.3.1 Finder(OS X) 224

7.3.2 SpringBoard(iOS) 225

7.4 XPC(Lion和iOS) 230

7.5本章小结 234

参考文献和深入阅读 235

第Ⅱ部分 内核 239

第8章 内核架构 239

8.1内核基础知识 239

8.2用户态和内核态 243

8.2.1 Intel架构—ring 243

8.2.2 ARM架构—CPSR 244

8.3内核态/用户态转换机制 245

8.3.1 Intel上的陷阱处理程序 246

8.3.2自愿的内核转换 254

8.4系统调用的处理 259

8.4.1 POSIX/BSD系统调用 260

8.4.2 Mach陷阱 263

8.4.3机器相关的调用 267

8.4.4诊断调用 268

8.5 XNU和硬件抽象 270

8.6本章小结 272

参考文献 272

第9章 由生到死——内核引导和内核崩溃 273

9.1 XNU源代码 273

9.1.1获得源代码 273

9.1.2 make XNU 274

9.1.3一个内核,多种架构支持 276

9.1.4 XNU源代码树 278

9.2引导XNU 281

9.2.1引导过程概览 281

9.2.2 OS X: vstart 282

9.2.3 iOS: start 283

9.2.4 [i386|arm]_init 283

9.2.5 i386_ init_slave() 285

9.2.6 machine_startup 285

9.2.7 kernel bootstrap 286

9.2.8 kernel bootstrap_thread 289

9.2.9 bsd init 291

9.2.10 bsdinit task 296

9.2.11睡眠和唤醒 299

9.3引导参数 300

9.4内核调试 302

9.4.1“不要害怕”——避免panic 303

9.4.2 panic的实现 304

9.4.3 panic报告 306

9.5本章小结 310

参考文献 310

第10章Mach原语:一切以消息为媒介 311

10.1 Mach概述 311

10.1.1 Mach设计原则 312

10.1.2 Mach设计目标 313

10.2 Mach消息 313

10.2.1简单消息 313

10.2.2复杂消息 314

10.2.3发送消息 315

10.2.4端口 316

10.2.5 Mach接口生成器(MIG) 318

10.3深入IPC 323

10.4同步原语 326

10.4.1锁组对象 326

10.4.2互斥体对象 327

10.4.3读写锁对象 328

10.4.4自旋锁对象 329

10.4.5信号量对象 329

10.4.6锁集对象 331

10.5机器原语 332

10.5.1主机对象 332

10.5.2时钟对象 341

10.5.3处理器对象 343

10.5.4处理器集对象 346

10.6本章小结 350

参考文献 350

第11章 刹那之间——Mach调度 351

11.1调度原语 351

11.1.1线程 351

11.1.2任务 356

11.1.3任务和线程相关的API 360

11.1.4任务相关的API 361

11.1.5线程相关的API 365

11.2调度 369

11.2.1概述 369

11.2.2优先级 370

11.2.3运行队列 373

11.3 Mach调度器的独特特性 376

11.3.1控制权转交 376

11.3.2续体 376

11.3.3抢占模式 378

11.3.4异步软件陷阱(AST) 383

11.3.5调度算法 386

11.4定时器中断 389

11.4.1中断驱动的调度 389

11.4.2 XNU中的定时器中断处理 390

11.5异常 394

11.5.1 Mach异常模型 394

11.5.2实现细节 395

11.6本章小结 403

参考文献 403

第12章Mach虚拟内存 405

12.1虚拟内存架构 405

12.1.1虚拟内存全貌 405

12.1.2虚拟内存概述 406

12.1.3用户态视角 410

12.2物理内存管理 419

12.2.1 pmap的API 420

12.2.2 API在Intel架构上的实现示例 421

12.3 Mach Zone 423

12.3.1 Mach Zone的结构 424

12.3.2引导期间的zone设置 426

12.3.3 zone垃圾回收 427

12.3.4 zone调试 428

12.4内核内存分配器 429

12.4.1 kernel_ memory_allocate() 429

12.4.2 kmem_alloc()系列函数 431

12.4.3 kalloc 432

12.4.4 OSMalloc 433

12.5 Mach分页器 434

12.5.1 Mach分页器接口 435

12.5.2 Universal Page List 438

12.5.3分页器类型 440

12.6分页策略管理 447

12.6.1 Pageout守护程序 448

12.6.2处理页错误 450

12.6.3 dynamic_pager(8)(OS X) 451

12.7本章小结 452

参考文献 452

第13章BSD层 453

13.1 BSD简介 453

13.1.1一统天下 454

13.1.2 POSIX标准中的内容 454

13.1.3实现BSD 455

13.1.4 XNU不是完整的BSD 455

13.2进程和线程 455

13.2.1 BSD进程结构 456

13.2.2进程列表和进程组 458

13.2.3线程 459

13.2.4对应到Mach 461

13.3进程创建 463

13.3.1用户态的角度 463

13.3.2内核态的角度 464

13.3.3加载和执行二进制文件 467

13.3.4 Mach-O二进制文件 472

13.4进程控制和跟踪 475

13.4.1 ptrace (#26) 475

13.4.2 proc_info (#336) 476

13.4.3策略 476

13.4.4进程挂起和恢复 477

13.5信号 478

13.5.1 UNIX异常处理程序 478

13.5.2硬件产生的信号 483

13.5.3软件产生的信号 484

13.5.4受害者的信号处理 484

13.6本章小结 485

参考文献 485

第14章 有新有旧:BSD高级功能 487

14.1内存管理 487

14.1.1 POSIX内存和页面管理系统调用 487

14.1.2 BSD内部的内存函数 489

14.1.3内存压力 492

14.1.4 Jetsam(iOS) 493

14.1.5内核地址空间布局随机化 495

14.2工作队列 496

14.3换个角度看BSD层 499

14.3.1 sysctl 499

14.3.2 kqueue 501

14.3.3审计(OS X) 503

14.3.4强制访问控制(MAC) 504

14.4苹果的策略模块 506

14.5本章小结 509

参考文献 509

第15章 文件系统和虚拟文件系统交换 511

15.1磁盘设备和分区 511

15.2通用文件系统的概念 522

15.2.1文件 522

15.2.2扩展属性 522

15.2.3权限 522

15.2.4时间戳 522

15.2.5快捷方式和连接 523

15.3苹果生态圈中的文件系统 524

15.3.1苹果原生的文件系统 524

15.3.2 DOS/Windows文件系统 524

15.3.3 CD/DVD文件系统 525

15.3.4基于网络的文件系统 526

15.3.5伪文件系统 528

15.4挂载文件系统(仅限于OS X) 531

15.4.1 automount 531

15.4.2磁盘仲裁 531

15.5磁盘镜像文件 533

15.5.1原始DMG文件 533

15.5.2从磁盘镜像引导(Lion) 534

15.6虚拟文件系统交换 534

15.6.1文件系统条目 535

15.6.2挂载条目 535

15.6.3 vnode对象 538

15.7 FUSE——用户空间的文件系统 541

15.8进程的文件I/O操作 543

15.9本章小结 547

参考文献和深入阅读 547

第16章 基于B树的HFS+文件系统 549

16.1 HFS+文件系统概念 549

16.1.1时间戳 549

16.1.2访问控制表 550

16.1.3扩展属性 550

16.1.4 fork 552

16.1.5压缩 553

16.1.6 Unicode支持 558

16.1.7 Finder集成 558

16.1.8大小写敏感(HFSX) 559

16.1.9日志 560

16.1.10动态大小调节 561

16.1.11元数据区域 561

16.1.12热文件 562

16.1.13动态碎片整理 562

16.2 HFS+的设计概念 564

16.3组件 570

16.3.1 HFS+宗卷头 571

16.3.2编录文件 572

16.3.3 extent溢出文件 579

16.3.4属性B树 579

16.3.5热文件B树 580

16.3.6分配文件 581

16.3.7 HFS日志 581

16.4 VFS和内核的整合 584

16.4.1 fsctl(2)的整合 584

16.4.2 sysctl(2)的整合 585

16.4.3文件系统状态通知 585

16.5本章小结 586

参考文献 586

第17章 遵守协议:网络协议栈 587

17.1用户态接口回顾 588

17.1.1 UNIX Domain套接字 589

17.1.2 IPv4网络协议 589

17.1.3路由套接字 590

17.1.4网络驱动程序套接字 590

17.1.5 IPSec Key Management套接字 592

17.1.6 IPv6网络协议 592

17.1.7系统套接字 593

17.2套接字和协议统计信息 595

17.3第5层:套接字 597

17.3.1套接字描述符 597

17.3.2 mbuf 598

17.3.3内核态中的套接字 603

17.4第4层:传输层协议 604

17.4.1域和protosw 605

17.4.2初始化域 609

17.5第3层:网络层协议 610

17.6第2层:网络接口层 613

17.6.1 OS X和iOS中的网络接口 613

17.6.2数据链路接口层 614

17.6.3 ifnet结构体 614

17.6.4案例研究:utun 616

17.7整合所有层:网络协议栈 620

17.7.1接收数据 620

17.7.2发送数据 623

17.8数据包过滤 626

17.8.1套接字过滤器 627

17.8.2 ipfw(8) 628

17.8.3 PF包过滤器(Lion和iOS) 629

17.8.4 IP过滤器 630

17.8.5接口过滤器 632

17.8.6伯克利数据包过滤器 633

17.9流量整形和QoS 637

17.9.1综合服务模型 637

17.9.2区分服务模型 637

17.9.3实现dummynet 638

17.9.4在用户态控制参数 638

17.10本章小结 639

参考文献和深入阅读 639

第18章 内核扩展模块 641

18.1扩展内核的功能 641

18.2内核扩展(kext) 643

18.2.1 kext结构 645

18.2.2 kext安全需求 647

18.2.3内核扩展的相关操作 647

18.2.4 kernelcache 647

18.2.5 multi-kext 651

18.2.6从程序员的视角看kext 651

18.2.7 kext的内核支持 652

18.3本章小结 661

参考文献 662

第19章 驱动力——I/O Kit驱动程序框架 663

19.1 I/O Kit简介 664

19.1.1设备驱动程序的编程约束 664

19.1.2 I/O Kit是什么 664

19.1.3 I/O Kit不是什么 666

19.2 libkem: I/O Kit的基类 667

19.2.1 OSObject 668

19.2.2 OSMetaClass 668

19.3 I/O Registry 669

19.3.1 IORegistryEntry 671

19.3.2 IOService 671

19.4用户态的I/O Kit 671

19.4.1访问I/O Registry 672

19.4.2获得/设置驱动程序属性 674

19.4.3即插即用(通知端口) 675

19.4.4 I/O Kit电源管理 676

19.4.5其他I/O Kit子系统 677

19.4.6 I/O Kit诊断 678

19.5 I/O Kit内核驱动程序 680

19.5.1驱动程序匹配 680

19.5.2 I/O Kit族 682

19.5.3 I/O Kit驱动程序模型 685

19.5.4 IOWorkLoop 687

19.5.5中断处理 689

19.5.6 I/O Kit内存管理 691

19.6整合BSD 693

19.7本章小结 694

参考文献和深入阅读 695

附录A了解机器架构 697