上篇 内核 2
第1章 ARM多核处理器 2
1.1 SMP相关基础数据结构 3
1.2 Percpu内存管理 6
1.2.1 内核显式定义的处理器局部数据 6
1.2.2 Percpu内存管理的建立 8
1.2.3 Percpu动态分配内存空间 13
1.3 CpuFreq 15
1.3.1 初始化 15
1.3.2 CpuFreq策略的建立 16
1.3.3 Ondemand调频算法分析 18
1.4 CPU0 bootup CPU1 19
1.4.1 CPU0侧策略和动作 19
1.4.2 CPU1侧执行路线 21
1.5 CPU1的关闭 23
1.5.1 关闭时机 23
1.5.2 CPU1关闭操作 24
1.6 ARM处理器展望 26
1.6.1 ARM架构处理器的演进 26
1.6.2 TrustZone 27
1.6.3 ARM Virtualization 28
第2章 异常 33
2.1 异常向量表 33
2.1.1 异常进入 33
2.1.2 异常表的构建 35
2.2 中断体系 37
2.2.1 Cortex A9多核处理器的中断控制器GIC 37
2.2.2 MT6577的中断体系 38
2.2.3 Exynos4的中断体系 42
2.2.4 OMAP4的中断体系 46
2.3 中断处理 49
2.3.1 中断的基本结构 49
2.3.2 中断源识别 51
2.4 数据异常 54
2.5 处理器间通信 56
第3章 调度与实时性 62
3.1 Tick 62
3.1.1 Local timer 62
3.1.2 Tick挂载 63
3.1.3 Tick产生 66
3.2 Fair调度类 67
3.2.1 Fair调度类的负载均衡 67
3.2.2 Fair调度类的处理器选择 72
3.3 RT调度类 73
3.3.1 RT调度类的基本结构 73
3.3.2 Rt_Bandwidth 76
3.3.3 负载均衡与抢占 79
3.3.4 基础操作 80
3.4 调度器 82
3.4.1 调度域的构建 82
3.4.2 调度器 86
3.5 唤醒 89
3.5.1 唤醒与抢占 89
3.5.2 跨处理器分发线程 91
3.5.3 抢占 92
第4章 Signal 99
4.1 信号发送 99
4.2 信号执行 102
4.2.1 路径切换 102
4.2.2 ARM Linux下信号执行环境的搭建 103
4.2.3 Signal处理函数的返回 107
4.2.4 系统调用重入 109
第5章 进程与进程内存 111
5.1 Linux进程 111
5.1.1 Fork 111
5.1.2 Exec新进程创建 112
5.2 CPU与MMU 117
5.2.1 ARM Linux页表页目录结构 117
5.2.2 页表页目录的建立 120
5.3 进程虚拟内存 122
5.3.1 Android进程虚拟内存的继承 122
5.3.2 进程虚拟地址空间的获得 127
第6章 缺页请页与内存Shrink 129
6.1 缺页与请页 129
6.1.1 File backed虚拟内存段操作函数 130
6.1.2 File backed内存的请页 131
6.1.3 匿名内存的请页 134
6.1.4 COW访问 135
6.2 内存Shrink 137
6.2.1 Shrink操作shrink_page_list 137
6.2.2 Clean Page 142
6.2.3 脏页的监控 143
6.3 全景图 145
第7章 块设备 148
7.1 Bdev文件系统 148
7.2 块设备基础结构 150
7.3 块设备的创建与注册 152
7.4 分区检测生成 156
7.5 块设备的打开 157
7.6 块设备驱动的层次结构 159
7.7 虚拟块设备 161
第8章 VFS 163
8.1 根目录 163
8.1.1 根目录文件系统——initramfs 165
8.1.2 Android ramdisk.img 166
8.1.3 传统根目录文件系统加载方式 166
8.2 文件打开 166
8.2.1 目录的层级查找 167
8.2.2 各层次操作函数的安装 171
8.3 文件写 172
8.3.1 文件写框架 172
8.3.2 write_begin 174
8.3.3 write_end 176
8.4 脏页的提交与回写机制 177
8.4.1 脏页的提交 177
8.4.2 回写时机 179
8.4.3 回写机制的层次操作 183
8.4.4 节点层次的回写 183
第9章 EXT4文件系统 191
9.1 Android文件系统的选择 191
9.2 EXT4文件节点 191
9.2.1 EXT4 inode基础结构 191
9.2.2 EXt4 raw inode的定位 192
9.2.3 EXT4 inode的获取 193
9.3 Mount 195
9.4 EXT4文件写操作 197
9.5 EXT4 journal 199
9.6 Extent tree 202
9.6.1 基础结构 202
9.6.2 定位逻辑块的struct ext4_extent 203
9.6.3 定位逻辑块左右侧的struct ext4_extent项 205
9.7 块分配 208
9.7.1 块组的buddy算法 208
9.7.2 分配物理块 217
9.8 逻辑块到物理块的映射 225
第10章 RCU 229
10.1 RCU tree 229
10.1.1 RCU Tree结构 229
10.1.2 RCU tree的构建 230
10.2 Grace Period 232
10.2.1 Grace Period的检测 232
10.2.2 重新启动新一轮Grace Period 235
10.3 RCU函数的执行 237
第11章 MMC Driver 238
11.1 MMC Driver 238
11.1.1 MMC协议层 238
11.1.2 MMC块设备 239
11.2 开源手机U8836D(MT6577)分区的实现 242
第12章 内核配置系统及内核调试 246
12.1 Conf 246
12.1.1 Kconfig元素 246
12.1.2 Kconfig分析 247
12.2 内核调试 248
12.2.1 senix_printk 249
12.2.2 LOG_BUF 252
下篇 Dalvik与Android用户态源码分析 258
第13章 内存 258
13.1 Dalvik内存管理 258
13.1.1 虚拟内存分配 258
13.1.2 内存回收 263
13.2 Ashmem 265
13.3 GC 267
13.3.1 对象Mark 267
13.3.2 从Root对象集到普通对象 268
13.3.3 GC与线程实时性 270
第14章 进程与线程 272
14.1 Dalvik虚拟机的进程 272
14.2 Dalvik线程创建机制 273
14.3 Android线程模型 276
14.3.1 主线程的生成 276
14.3.2 线程池线程的生成 276
14.4 Java线程转换 278
14.4.1 从Java到JNI 278
14.4.2 从JNI到Java 279
第15章 Bionic的动态加载机制 283
15.1 Linker——用户态入口 283
15.2 Linker主体——link_image 284
第16章 Android系统初始 287
16.1 Android入口 287
16.2 Init——OS的入口 289
16.2.1 RC文件分析 289
16.2.2 RC动作执行 294
16.2.3 RC的逻辑分析 295
16.2.4 设备探测 295
16.2.5 property库的构建 297
16.2.6 Init的调试 299
第17章 Interpreter与JIT 301
17.1 解释器编译结构 301
17.2 Dalvik寄存器编译模型 301
17.2.1 Callee寄存器分配 301
17.2.2 Caller寄存器分配 303
17.2.3 outs的处理 304
17.3 Portable Interpreter结构 305
17.4 ASM Interpreter 306
17.4.1 基本结构 306
17.4.2 运行时模型与基本操作 308
17.4.3 ASM Interpreter入口 309
17.5 Interpreter的切换 311
17.6 Dalvik运行时帧结构 312
17.7 JIT 313
17.7.1 热点检测 313
17.7.2 Mode切换 315
17.7.3 JIT提交 316
17.8 Compile 317
17.8.1 基础数据结构 317
17.8.2 dalvik指令格式分析 319
17.8.3 TraceRun分析 319
17.8.4 MIR 323
17.8.5 基本块的逻辑关系 325
17.8.6 寄存器分配 327
17.8.7 LIR 332
17.8.8 Codecache 334
17.9 Dalvik ART 335
第18章 Binder 336
18.1 Parcel 336
18.1.1 C++层的Parcel 336
18.1.2 Java层的Parcel 337
18.2 Binder驱动 338
18.2.1 Binder写 339
18.2.2 Binder读 344
18.3 C++层面 346
18.3.1 本地与远端对象 346
18.3.2 服务的建立 349
18.4 Java层面 350
18.5 service_manager 351
第19章 Class 352
19.1 系统类库 352
19.1.1 Inital class 352
19.1.2 ODEX文件的加载 353
19.1.3 系统类库 354
19.1.4 preloaded-classes 355
19.2 类加载 357
19.2.1 类加载框架 357
19.2.2 类加载 359
19.3 对象实体生成 361
第20章 Android应用框架 363
20.1 线程池线程 363
20.1.1 C++层 363
20.1.2 Java层 365
20.2 系统侧Activity与Service的生成控制 366
20.3 class ActivityThread 368
20.3.1 MainLooper 368
20.3.2 activity与service的加载 370
第21章 Android UI体系 371
21.1 窗口体系的生成 371
21.2 ViewRoot与Surface 372
21.3 编辑框实例分析 373
21.3.1 ViewRoot获得系统侧代理对象 373
21.3.2 焦点切换事件——主要Android UI机制的互动 375
21.3.3 输入事件的处理 376
21.3.4 编辑框的生成 377
第22章 ADB 379
22.1 ADB基本结构 379
22.1.1 连接 379
22.1.2 主线程 381
22.1.3 主线程监测的文件句柄 382
22.2 Transport 382
22.2.1 初始化 382
22.2.2 transport传输线程 384
22.2.3 transport的管理 386
22.3 Local服务 389
22.3.1 Local服务的种类 389
22.3.2 Local服务的形态 391
22.3.3 SYNC服务 392
第23章 Android浏览器的Webkit分析 394
23.1 Webcore 394
23.1.1 DOM与Rendering树生成 394
23.1.2 事件的产生与分发 397
23.2 V8 parser源码分析 401
23.2.1 V8 parser处理脚本的层次 402
23.2.2 Scope 406
23.2.3 语法分析的入口Parser::ParseStatement(…) 408
23.2.4 普通语句的分析 409
23.3 指令生成 415