《ARM Linux内核源码剖析》是多位作者在3年Liunx内核分析经验和庞大资料基础上写成的,收录了其他同类书未曾讲解的内容并进行逐行分析,一扫当前市场中其他理论书带给读者的郁闷。书中详细的代码分析与大量插图能够使读者对Linux内核及ARM获得正确认识,自然而然习得如何有效分析定期发布的Linux内核。
《ARM Linux内核源码剖析》适合想从Linux内核启动开始透彻分析全部启动过程的读者,因Linux代码量庞大而束手无策的人、想要了解Linux实际运行过程的人、渴求OS实操理论的人,本书必将成为他们不可或缺的参考书。
目录
- 第一部分 ARMLinux内核——分析内核前需要做的准备
- 第1章 内核介绍及2.6版和3.2版之间的差异 2
- 1.1 内核的诞生、作用以及内部结构 2
- 1.1.1 Linus创造的Linux 2
- 1.1.2 由多种子系统集成运行的单内核 3
- 1.1.3 全世界最著名的通用操作系统 5
- 1.2 内核2.6版和3.2版之间的差异 5
- 第2章 内核构建系统 8
- 2.1 内核初始化 8
- 2.2 内核配置 9
- 2.3 内核构建 11
- 2.4 内核安装 17
- 第3章 了解ARM处理器 19
- 3.1 处理器概要和特征 19
- 3.2 处理器架构与核心 19
- 3.3 处理器命名规则 21
- 3.4 处理器内部结构 21
- 3.5 处理器模式和寄存器 23
- 3.6 处理器异常 25
- 3.7 硬件扩展功能 26
- 3.7.1 缓存 26
- 3.7.2 内存管理装置 26
- 3.7.3 协处理器 26
- 第4章 构建分析环境 28
- 4.1 下载并安装Linux源内核 28
- 4.1.1 下载源内核 28
- 4.1.2 安装源内核 30
- 4.2 安装ctags+cscope 31
- 4.2.1 用ctags制作源代码标签 31
- 4.2.2 制作cscope标签数据库 33
- 4.3 vim插件下载及环境设置 34
- 4.3.1 下载vim插件 34
- 4.3.2 vim+plugin的环境结构 37
- 4.3.3 vim环境设置 38
- 4.4 查看源码分析环境工具 40
- 第二部分 内核的启动——start_kernel调用方法
- 第5章 准备解压内核 48
- 5.1 进入启动加载后结束首个启动——start标签 49
- 5.2 BSS系统域初始化——not_relocated标签 50
- 5.3 激活缓存——cache_on标签 53
- 5.4 页目录项初始化——__setup_mmu标签 56
- 5.5 指令缓存激活及缓存策略适用——__common_mmu_cache_on标签 58
- 第6章 从压缩的内核zImage还原内核映像 60
- 6.1 解压内核并避免覆写——wont_overwrite、decompress_kernel标签 61
- 6.2 调用已解压内核——call_kernel标签 62
- 6.3 缓存清理及清除——cache_clean_flush标签 62
- 6.4 缓存禁用——cache_off标签 64
- 第7章 调用start_kernel() 65
- 7.1 初始化指向——stext标签 65
- 7.2 处理器信息搜寻——__look_processor_type 69
- 7.2.1 __lookup_processor_type标签 69
- 7.2.2 __proc_info_begin和__proc_info_end中保存的信息 71
- 7.2.3 在MMU禁用状态下将虚拟地址转换为物理地址 73
- 7.2.4 查找proc_info_list结构体并比较处理器信息 74
- 7.3 搜寻我的机型——__lookup_machine_type 75
- 7.3.1 __lookup_machine_type标签 75
- 7.3.2 保存在__arch_info_begin和__arch_info_end中的machine_desc信息及访问路径 76
- 7.3.3 查找machine_desc结构体并比较机器信息 77
- 7.4 源自启动加载项的atags——__vet_atags标签 78
- 7.5 对虚拟内存进行基础创建——__create_page_tables标签 81
- 7.6 设置核心(core)——v6_setup标签 85
- 7.7 打开MMU并使用虚拟地址——__enable_mmu/__turn_mmu_on标签 86
- 7.8 跳转至start_kernel——__mmap_switched标签 90
- 第三部分 内核的执行——内核的起始与结束位置
- 第8章 start_setup_processor_id()~~lock_kernel() 94
- 8.1 smp_setup_processor_id()、lockdep_init()、debug_objects_early_init() 95
- 8.1.1 smp_setup_processor_id() 95
- 8.1.2 lockdep_init() 95
- 8.1.3 debug_objects_early_init() 96
- 8.2 栈溢出感应——__boot_init_stack_canary 98
- 8.3 初始化提供进程集成方法的cgroup——__cgroup_init_early() 98
- 8.3.1 cgroupfs_root和cgroup的关联初始化——init_cgroup_root() 102
- 8.3.2 初始化子系统——cgroup_init_subsys() 103
- 8.4 禁用IRQ 104
- 8.5 early_boot_irqs_off()、early_init_irq_lock_class() 104
- 8.6 大内核锁——lock_kernel() 106
- 第9章 注册针对时钟事件的处理器 111
- 9.1 函数的声明和定义——tick_init() 111
- 9.2 注册处理事件的处理器——_clockevents_register_notifier() 113
- 9.2.1 为clockevents_lock添加自旋锁 114
- 9.2.2 clockevents_chain生成原理 115
- 9.2.3 在clockevents_chain中注册tick_notifier的方法 116
- 9.2.4 对clockevents_lock解除自旋锁的原理 117
- 第10章 在CPU位图中注册当前运行CPU/初始化HIGHMEM管理 119
- 10.1 在包含热插拔信息的位图上添加执行init_task的CPU——boot_cpu_init() 119
- 10.2 管理高端内存——page_address_init() 121
- 第11章 整体指向——setup_arch 123
- 第12章 unwind_init()~~early_trap_init() 126
- 12.1 栈回溯——unwind_init() 126
- 12.2 求出包含机器信息的machine_desc结构体——setup_machine() 126
- 12.3 处理ATAG信息——setup_arch() 127
- 12.4 处理启动参数——parse_cmdline() 129
- 12.5 构建源代码树——request_standard_resources() 131
- 12.6 初始化cpupossible位图——smp_init_cpus() 136
- 12.7 用栈指定各ARM异常模式——cpu_init() 137
- 12.8 初始化以处理异常——early_trap_init() 138
- 12.9 查看中断处理器函数 143
- 12.9.1 调用IRQ处理器——asm_do_IRQ() 147
- 12.9.2 返回中断之前——ret_to_user标签 147
- 第13章 设置处理器——setup_processor() 150
- 13.1 查看setup_processor()结构 150
- 13.2 查找CPUID——read_cpuid_id() 151
- 13.3 查找处理器信息——lookup_processor_type() 153
- 13.4 查找处理器结构信息——cpu_architecture() 153
- 13.5 查找处理器缓存类型_cacheid_init() 156
- 13.6 调用处理器初始化函数——cpu_proc_init() 160
- 第14章 准备内存分页——paging_init() 163
- 14.1 查看paging_init()的整体结构 163
- 14.2 设置内存类型表——build_mem_type_table() 165
- 14.3 检验内存信息——sanity_check_meminfo() 166
- 14.4 准备页表——prepare_page_table() 168
- 14.4.1 prepare_page_table() 168
- 14.4.2 Linux的分页结构 170
- 14.4.3 求出页目录项 170
- 14.4.4 pmd_clear() 172
- 14.5 设备区域映射准备——devicemaps_init() 174
- 14.6 准备使用高端内存——kmap_init() 177
- 14.7 初始化零页 178
- 14.7.1 分配内存——__alloc_bootmem_nopanic() 179
- 14.7.2 在指定节点使用fallback分配内存——alloc_bootmem_core 180
- 14.7.3 将虚拟地址变换为page结构体——virt_to_page 182
- 14.8 保持数据缓存一致性——flush_dcache_page() 182
- 第15章 在启动时初始化内存分配器 184
- 15.1 bootmem函数流和数据结构 185
- 15.2 查看bootmem_init()结构 188
- 15.3 查找虚拟内存盘位置——check_initrd() 189
- 15.4 将节点的BANK信息反映到页目录——bootmem_init_node() 191
- 15.4.1 map_memory_bank() 192
- 15.4.2 bootmem_bootmap_pages() 195
- 15.4.3 find_bootmap_pfn() 196
- 15.4.4 node_set_online() 197
- 15.4.5 NODE_DATA宏 198
- 15.4.6 init_bootmem_node() 200
- 15.4.7 free_bootmem_node() 202
- 15.4.8 reserve_bootmem_node() 202
- 15.5 排除0号节点——reserve_node_zero() 203
- 15.6 排除虚拟内存盘节点——bootmem_reserve_initrd() 204
- 15.7 设置为无可用页——bootmem_free_node() 205
- 15.8 初始化free_area区域 207
- 15.8.1 free_area结构体 207
- 15.8.2 free_area_init_node() 208
- 15.8.3 free_area_init_core() 209
- 15.8.4 init_currently_empty_zone() 211
- 15.8.5 memmap_init() 212
- 第16章 mm_init_owner()~~preempt_disable() 217
- 第17章 构建借用内存的后台 233
- 第18章 page_alloc_init()~~pidhash_init() 253
- 第19章 init_timers()~~page_cgroup_init() 273
- 第20章 终止bootmem分配器并替换为伙伴系统 297
- 第21章 初始化以支持CPU热插拔 315
- 第22章 激活slab内存分配器——kmem_cache_init() 318
- 第23章 kmem_trace_init()~~security_init() 344
- 第24章 初始化VFS中使用的多种缓存——vfs_cache_init() 367
- 第25章 radix_tree_init()~~ftrace_init() 382
- 第26章 同步内存与后备存储——pagewriteback 394
- 第27章 查看启动内核的最终函数结构——rest_init() 405
- 第28章 生成执行函数的内核线程——kernel_thread() 407
- 第29章 唤醒新生成的任务 419
- 第30章 准备使用内核 426
- 第31章 内核线程守护进程 453
- 第32章 find_task_by_pid_ns()~~cpu_idle() 469
- 附录
- 附录A 汇编语言、gas关键词总结 480
- 附录B 内核分析常见API 485
- 附录C 浅谈ext2文件系统 487
- 附录D Linux线程模型 497
- 附录E 链接器脚本文件结构 500
- 后记 510
- 索引 513