文章目录
- 一、概述
- 二、形象比喻:航天飞机发射倒计时
- 三、内核启动流程图
- 四、U-Boot 传递给内核的约定
- 五、head.S 关键步骤源码分析
- __create_page_tables 详解
- 六、__mmap_switched:汇编到 C 的桥梁
- 七、head.S 阶段的常见失败场景
- 如何调试 head.S 阶段问题
- 八、Image vs zImage:两种内核格式的差异
- 📝 本章小结
- 🏠 课后练习
这一章是全课程技术密度最高的一章,讲内核启动流程,从 head.S 的第一行汇编一直讲到 start_kernel 的第一行 C 代码。建议分两次听:第一次听"宏观流程",也就是第二到第六节,先建立全景;第二次再"钻源码",第五、六节逐行看。汇编细节别指望一次记住,重点是知道"卡在某步该查哪"–这就是本章的诊断价值。全章大约 35 到 40 分钟。学完这一章,你就能诊断 90% 的启动失败问题。
开讲前先把四个学习目标念一遍,带着听。第一,U-Boot 跳转到内核时,CPU 寄存器 r0、r1、r2 是什么状态?第二,head.S 如何验证 CPU 和 DTB 是否有效?第三,为什么需要创建临时页表?恒等映射和内核映射分别解决什么问题?第四,RK3506 的内核为什么是压缩的?zImage 和 Image 在启动流程上有什么本质区别?再次强调,学完不是要你会写汇编,而是要会判断"卡在哪一步、查什么"。
一、概述
内核启动流程是系统移植中最重要的知识之一。理解从head.S(第一行汇编)到start_kernel()(第一行 C 代码)的完整链路,你就能诊断 90% 的启动失败问题。
学完本章你将能回答:
- U-Boot 跳转到内核时,CPU 寄存器(r0/r1/r2)是什么状态?
head.S如何验证 CPU 和 DTB 是否有效?- 为什么需要创建临时页表?恒等映射和内核映射分别解决什么问题?
- RK3506 的内核为什么是压缩的(CONFIG_KE