ARM Linux内核源码剖析 尹锡训著 完整版PDF(带书签目录) 《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
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/47995.html