1. Linux 引导过程简介
Linux 启动代码之旅,首先我们需要了解 Linux 的引导过程。当计算机开机时,BIOS 会首先运行并完成自检等硬件初始化工作,然后将引导权交给 MBR(Master Boot Record)。
MBR 存储着启动设备的引导记录,并包含一个小程序 GRUB(GNU GRand Unified Bootloader)。GRUB 的主要作用是加载 Linux 内核及相关系统文件,并在引导过程中提供菜单供用户选择。
引导过程分为两个阶段:第一阶段由 GRUB 负责加载,第二阶段由 Linux 内核负责。
2. GRUB 的工作原理
GRUB 的工作分为两个阶段:第一阶段和第二阶段。
2.1 第一阶段
第一阶段 GRUB 位于 MBR,其主要任务是加载第二阶段 GRUB。第一阶段的代码非常简洁,只需占用 512 字节。第一阶段 GRUB 先读取自身的配置文件 grub.conf(或者 grub.cfg),然后根据配置文件中的设置加载第二阶段的代码。
stage1_5 = (hd0) (hd0,4) +1
上面的代码是配置文件 grub.conf 中的内容。其中 stage1_5 指定了第二阶段 GRUB 的位置,(hd0) 表示硬盘的第一个分区,(hd0,4) 表示第一个硬盘的第五个分区。+1 表示从第二阶段 GRUB 的起始位置加载。
2.2 第二阶段
第二阶段 GRUB 一旦被加载成功,就会进入命令行界面,等待用户选择。用户可以选择要启动的操作系统和内核版本等。选择完毕后,GRUB 会根据用户的选择加载相应的内核及文件系统模块,并将控制权交给 Linux 内核。
第二阶段 GRUB 的基础是一个目录和文件的树结构,具体文件在配置文件中定义。GRUB 根据配置文件中的指令和参数,搜索和加载内核文件及其依赖的文件模块。这些文件模块包括设备驱动程序、文件系统驱动程序等。
3. Linux 内核启动过程
当 GRUB 将控制权交给 Linux 内核后,Linux 内核开始执行自己的初始化操作,并加载 initrd 文件(若存在)。
Linux 内核的启动过程包括以下几个步骤:
3.1 加载内核
Linux 内核是由编译得到的二进制文件 vmlinuz(或 vmlinux)存储的。
Loading Linux ...
在内核加载过程中,屏幕上会显示出类似上述的提示信息。内核加载完毕后,控制权交给了内核的启动参数处理程序。
3.2 启动参数处理
在加载完内核后,内核会解析传递给它的启动参数。启动参数中包含了内核启动时的一些配置信息,比如根文件系统的位置、启动级别等。
kernel /boot/vmlinuz-5.12.0-rc5 root=/dev/sda2 ro
上述代码是一个内核的启动参数示例,其中 root 指定了根文件系统的位置,一般为 /dev/sda2,ro 表示以只读方式挂载。
3.3 硬件初始化
内核会先进行硬件的初始化工作,包括 CPU、内存、硬盘等设备的初始化。
Initializing CPU#0...
上述代码是内核进行 CPU 初始化的提示信息。
3.4 启动 init 进程
内核初始化完毕后,会启动 init 进程,init 进程是用户空间的第一个进程。init 进程负责系统的初始化和进程的管理,是用户空间的“老祖宗”。
4. 总结
本文简要介绍了 Linux 的引导过程,并详细阐述了 GRUB 和 Linux 内核的启动过程。GRUB 负责加载 Linux 内核及相关文件,而 Linux 内核初始化硬件并启动 init 进程。理解 Linux 的引导过程对于深入了解 Linux 系统的工作原理以及系统调优等方面都非常重要。
参考文献:
[1] Silberschatz, A., Galvin, P. B., & Gagne, G. (2018). Operating System Concepts (10th ed.). Wiley.