内核引导过程
欢迎来到 Linux 内核的引导之旅。本章一步步讲述了从你开机那一刻起,到 Linux 内核加载到您机器的内存中时,完整的启动阶段。
阅读方法
本章假设你熟悉基础计算机架构,并对 C 语言和 x86_64 汇编语法略有了解。你不需要成为内核专家,但读懂短代码片段和识别硬件术语会对阅读本章很有帮助。
本章的每一部分都聚焦于一个启动阶段。第一次按顺序阅读,然后,在想将特定符号或寄存器映射到序列中的位置时,作为参考点,逐步回顾。在本地电脑上拥有 Linux 内核的源代码,有助于了解细节。您可以使用以下命令获取源代码:
git clone git@github.com:torvalds/linux.git
术语表
在阅读本章及其他章节时,你可能会遇到一些专业术语:
CS,DS,SS,CR0,CR3,CR4,EFER- 代表 x86 段寄存器和控制寄存器0x...- 表示十六进制值entry_*和startup_*- 是早期引导符号的常见前缀setup code指的是 Linux 内核的早期部分,用于执行将内核代码本身加载到内存的准备工作decompressor指的是将压缩后的内核映像解压到内存的setup code部分。
你将学到什么
- 处理器从固件和引导加载程序到达内核入口点的方式
- x86_64 处理器的不同模式
- 内核本身之前的早期
setup code会被加载到内存中并开始工作
阅读顺序
- 从引导程序到内核 - 介绍了从开机到内核执行第一条指令之前的所有阶段;
- 在内核设置代码的第一步 - 介绍了在内核设置代码的第一个步骤。你会看到堆的初始化,查询不同的参数,如 EDD,IST 等…
- 视频模式初始化和保护模式切换 - 介绍了内核设置代码中的视频模式初始化,并切换到保护模式。
- 切换 64 位模式 - 介绍切换到 64 位模式的准备工作以及切换的细节。
- 内核解压缩 - 介绍了内核解压缩之前的准备工作以及直接解压缩的细节。
- 内核地址随机化 - 介绍了 Linux 内核加载地址随机化的细节。
内核版本
本章对应 Linux kernel v6.19。