一个Linux及相关开源软件的爱好者,在学习,分析和研究Linux内核过程中,对相关知识的总结和记录。一些参考书籍是必须的,参考Linux内核探索之路——关于书所提到的,本文中的部分内容参考了这里提到的书籍 (ULK和LKA尤甚)。目录 1. 写在前面 1.1. 它是什么? 1.2. 它不是什么? 1.3. 它的始末? 2. ARM汇编语言 2.1. ARM命名规则 2.2. 程序状态寄存器 2.3. ARM指令格式 2.4. 测试用例 2.5. 原码和补码 2.6. 条件码标志位 2.7. 跳转指令 2.8. 协处理器指令 2.9. ARM汇编伪指令 2.10. Sandbox 3. ARM寻址方式 3.1. 立即数寻址 3.2. 寄存器寻址 3.3. 寄 存器间接寻址 3.4. 基址寻址 3.5. 寄存器移位寻址 3.6. 堆栈寻址 3.7. 多寄存器寻址 3.8. 块拷贝寻址 3.9. 相对寻址 4. 批量加载和存储指令实践 4.1. 测试源码 4.2. stmfd和ldmfd 4.3. stmfa和ldmfa 4.4. stmed和ldmed 4.5. stmea和ldmea 4.6. ldmib和stmib 4.7. ldmia和stmia 4.8. ldmdb和stmdb 4.9. ldmda和stmda 5. ATPCS和内嵌汇编 5.1. ARM寄存器 5.2. 寄存器使用规则 5.3. 数据栈的使用 5.4. 返回值与寄存器 5.5. 内嵌汇编 5.6. Sandbox 6. Uboot启动分析 6.1. 硬件引导 6.2. bootm 6.3. do_bootm_linux 6.4. tag处理函数 6.5. Sandbox 7. zImage的生成和加载 7.1. 相关的Makefile 7.2. vmlinux的格式 7.3. 静默编译和V=1 7.4. 生成zImage的命令行 7.5. Makefile.build和vmlinux压缩 7.6. .cmd文件 7.7. V=2 7.8. piggy.gz 7.9. vmlinux的生成命令 7.10. vmlinux-xxx 7.11. vmlinux.lds和vmlinux.lds.S 7.12. head.S 7.13. 重定位内核 8. 内核加载 8.1. head.S 8.2. 检查处理器类型 8.3. 检查机器类型 8.4. 创建内核段页表 8.5. 使能MMU 8.6. 0号进程 9. 内核初始化 9.1. CPU掩码 9.2. 内核版本信息 9.3. 内存屏障 9.4. 内核抢占 9.5. printk 9.6. setup_arch 9.7. 直接地址转换 9.8. 内核页表 9.9. bootmem_init 9.10. devicemaps_init 9.11. 0页 9.12. Sandbox 10. Bootmem机制 10.1. 简介 10.2. bootmem_data 10.3. UMA和NUMA 10.4. Debug机制 10.5. 初始化函数 10.6. __reserve和__free 10.7. alloc_bootmem_core 10.8. Bootmem alloc宏 10.9. 标记函数 10.10. Bootmem机制的应用 10.11. Sandbox 11. 内核初始化2 11.1. resource资源分配 11.2. cpu_init 11.3. early_trap_init 11.4. sched_init 11.5. setup_command_line 11.6. build_all_zonelists 11.7. page_alloc_init 11.8. 第二阶段的参数解析 11.9. rcu_init 11.10. init_IRQ 11.11. pidhash_init 11.12. init_timers 11.13. hrtimers_init 11.14. Sandbox 11.15. Sandbox 12. 页表机制 12.1. 引言 12.2. 一级页表 12.3. ARM 内存访问 12.4. ARM MMU页表 12.5. 页面访问控制 12.6. create_mapping 12.7. alloc_init_section 12.8. alloc_init_pte 12.9. set_pte_ext 12.10. Sandbox 13. 内存管理 13.1. 引言 13.2. page管理项 13.3. bootmem_free_node 13.4. free_area_init_node 13.5. free_area_init_core 13.6. memmap_init_zone 13.7. build_all_zonelists 13.8. __build_all_zonelists 13.9. build_zonelists 13.10. build_zonelists_node 13.11. build_all_zonelists 14. 伙伴系统 14.1. 初始化zone 14.2. 收集空闲内存 14.3. vmalloc 14.4. Sandbox 15. IO设备管理 15.1. 总线 15.2. 资源resource 15.3. 系统实现 15.4. Sandbox 16. 中断处理 16.1. 概述 16.2. CPU处理 16.3. 中断向量 16.4. __irq_svc 16.5. 中断示例 16.6. 中断控制器 16.7. 中断控制寄存器 16.8. Linux内核中断抽象 16.9. Linux内核中断注册 16.10. 软中断 16.11. Tasklet 16.12. Sandbox 17. 内核参数解析 17.1. 前言 17.2. parse_args 17.3. 第二阶段 17.4. Sandbox 18. 时钟管理 18.1. 基本概念 18.2. S3C6410 PLL 18.3. S3C6410 CLK 18.4. 选择时钟源 18.5. 选通时钟源 18.6. PWM 定时器 18.7. 时钟源初始化 18.8. 内核计时体系 18.9. 时钟中断注册 18.10. 时钟中断处理 18.11. RTC时钟 18.12. 内核定时器 19. 内核通知链 19.1. 概述 19.2. 数据结构 19.3. 运作机制 19.4. Sandbox 20. 内核同步 20.1. 内核抢占 20.2. 内存屏障 20.3. 临界区控制 20.4. 同步技术 20.5. Sandbox 21. Linux设备模型 21.1. 设备文件 21.2. 字符设备注册 21.3. 关联文件系统 21.4. 字符设备操作 21.5. 阻塞I/O 21.6. 异步通知 21.7. Sandbox 22. 网络设备驱动 22.1. MAC和PHY 22.2. MDIO和MII 22.3. MII数据接口 22.4. RMII数据接口 22.5. MII管理接口MDIO 22.6. 常用单口以太网控制器 22.7. DM9000A简介 22.8. 注册DM9000A设备 22.9. 注册网卡驱动 23. Linux模式设计 23.1. 数据大小 23.2. 数据比较 23.3. 数据圆整 23.4. 数据对齐 23.5. 位图操作 23.6. 结构体成员互访 23.7. 结构体大小运算 23.8. 编译器检查 23.9. Sandbox 24. 附录 24.1. 参考书目 24.2. 参考网络资源 24.3. Sandbox 存器间接寻址 3.4. 基址寻址 3.5. 寄存器移位寻址 3.6. 堆栈寻址 3.7. 多寄存器寻址 3.8. 块拷贝寻址 3.9. 相对寻址 4. 批量加载和存储指令实践 4.1. 测试源码 4.2. stmfd和ldmfd 4.3. stmfa和ldmfa 4.4. stmed和ldmed 4.5. stmea和ldmea 4.6. ldmib和stmib 4.7. ldmia和stmia 4.8. ldmdb和stmdb 4.9. ldmda和stmda 5. ATPCS和内嵌汇编 5.1. ARM寄存器 5.2. 寄存器使用规则 5.3. 数据栈的使用 5.4. 返回值与寄存器 5.5. 内嵌汇编 5.6. Sandbox 6. Uboot启动分析 6.1. 硬件引导 6.2. bootm 6.3. do_bootm_linux 6.4. tag处理函数 6.5. Sandbox 7. zImage的生成和加载 7.1. 相关的Makefile 7.2. vmlinux的格式 7.3. 静默编译和V=1 7.4. 生成zImage的命令行 7.5. Makefile.build和vmlinux压缩 7.6. .cmd文件 7.7. V=2 7.8. piggy.gz 7.9. vmlinux的生成命令 7.10. vmlinux-xxx 7.11. vmlinux.lds和vmlinux.lds.S 7.12. head.S 7.13. 重定位内核 8. 内核加载 8.1. head.S 8.2. 检查处理器类型 8.3. 检查机器类型 8.4. 创建内核段页表 8.5. 使能MMU 8.6. 0号进程 9. 内核初始化 9.1. CPU掩码 9.2. 内核版本信息 9.3. 内存屏障 9.4. 内核抢占 9.5. printk 9.6. setup_arch 9.7. 直接地址转换 9.8. 内核页表 9.9. bootmem_init 9.10. devicemaps_init 9.11. 0页 9.12. Sandbox 10. Bootmem机制 10.1. 简介 10.2. bootmem_data 10.3. UMA和NUMA 10.4. Debug机制 10.5. 初始化函数 10.6. __reserve和__free 10.7. alloc_bootmem_core 10.8. Bootmem alloc宏 10.9. 标记函数 10.10. Bootmem机制的应用 10.11. Sandbox 11. 内核初始化2 11.1. resource资源分配 11.2. cpu_init 11.3. early_trap_init 11.4. sched_init 11.5. setup_command_line 11.6. build_all_zonelists 11.7. page_alloc_init 11.8. 第二阶段的参数解析 11.9. rcu_init 11.10. init_IRQ 11.11. pidhash_init 11.12. init_timers 11.13. hrtimers_init 11.14. Sandbox 11.15. Sandbox 12. 页表机制 12.1. 引言 12.2. 一级页表 12.3. ARM 内存访问 12.4. ARM MMU页表 12.5. 页面访问控制 12.6. create_mapping 12.7. alloc_init_section 12.8. alloc_init_pte 12.9. set_pte_ext 12.10. Sandbox 13. 内存管理 13.1. 引言 13.2. page管理项 13.3. bootmem_free_node 13.4. free_area_init_node 13.5. free_area_init_core 13.6. memmap_init_zone 13.7. build_all_zonelists 13.8. __build_all_zonelists 13.9. build_zonelists 13.10. build_zonelists_node 13.11. build_all_zonelists 14. 伙伴系统 14.1. 初始化zone 14.2. 收集空闲内存 14.3. vmalloc 14.4. Sandbox 15. IO设备管理 15.1. 总线 15.2. 资源resource 15.3. 系统实现 15.4. Sandbox 16. 中断处理 16.1. 概述 16.2. CPU处理 16.3. 中断向量 16.4. __irq_svc 16.5. 中断示例 16.6. 中断控制器 16.7. 中断控制寄存器 16.8. Linux内核中断抽象 16.9. Linux内核中断注册 16.10. 软中断 16.11. Tasklet 16.12. Sandbox 17. 内核参数解析 17.1. 前言 17.2. parse_args 17.3. 第二阶段 17.4. Sandbox 18. 时钟管理 18.1. 基本概念 18.2. S3C6410 PLL 18.3. S3C6410 CLK 18.4. 选择时钟源 18.5. 选通时钟源 18.6. PWM 定时器 18.7. 时钟源初始化 18.8. 内核计时体系 18.9. 时钟中断注册 18.10. 时钟中断处理 18.11. RTC时钟 18.12. 内核定时器 19. 内核通知链 19.1. 概述 19.2. 数据结构 19.3. 运作机制 19.4. Sandbox 20. 内核同步 20.1. 内核抢占 20.2. 内存屏障 20.3. 临界区控制 20.4. 同步技术 20.5. Sandbox 21. Linux设备模型 21.1. 设备文件 21.2. 字符设备注册 21.3. 关联文件系统 21.4. 字符设备操作 21.5. 阻塞I/O 21.6. 异步通知 21.7. Sandbox 22. 网络设备驱动 22.1. MAC和PHY 22.2. MDIO和MII 22.3. MII数据接口 22.4. RMII数据接口 22.5. MII管理接口MDIO 22.6. 常用单口以太网控制器 22.7. DM9000A简介 22.8. 注册DM9000A设备 22.9. 注册网卡驱动 23. Linux模式设计 23.1. 数据大小 23.2. 数据比较 23.3. 数据圆整 23.4. 数据对齐 23.5. 位图操作 23.6. 结构体成员互访 23.7. 结构体大小运算 23.8. 编译器检查 23.9. Sandbox 24. 附录 24.1. 参考书目 24.2. 参考网络资源 24.3. Sandbox