系列文章目录
深度探索Linux操作系统 —— 编译过程分析
深度探索Linux操作系统 —— 构建工具链
深度探索Linux操作系统 —— 构建内核
深度探索Linux操作系统 —— 构建initramfs
深度探索Linux操作系统 —— 从内核空间到用户空间
文章目录
- 系列文章目录
- 一、Linux操作系统加载
- 1、GRUB映像构成
- 2、安装GRUB
一、Linux操作系统加载
PC 上电或复位后,处理器跳转到 BIOS ,开始执行 BIOS。BIOS 首先进行加电自检,初始化相关硬件,然后加载 MBR 中的程序到内存 0x7c00 处并跳转到该地址处,接着由 MBR 中的程序完成操作系统的加载工作。通常,MBR 中的程序也被称为 Bootloader 。当然,鉴于现代操作系统的复杂性,Bootloader 已远远不止一个扇区大小。这一节,我们就以一个具体的 Bootloader —— GRUB 为例,探讨操作系统的加载过程。为简单起见,我们只讨论典型的从硬盘加载操作系统的过程,所以后续的讨论全部是针对从硬盘启动的情况。
PC 上硬盘的传统分区方式是 MBR 分区方案。但是 MBR 最大能表示的分区大小为 2TB。因此,随着硬盘容量的不断扩大,为了突破 MBR 分区方式的一些限制,20 世纪 90 年代 Intel 提出了 GPT 分区方案。对于不同的分区方式,加载操作系统的方式还是有些许不同的。也是为了简单起见,我们结合现在依然广泛使用的传统的 MBR 分区方案进行讨论。
1、GRUB映像构成
对于仅有 512 字节大小的 MBR,又要留给分区表 64 字节,在这么小的一个空间,已经很难容纳加载一个现代操作系统的代码。于是 GRUB 采取了分阶段的策略,MBR 中仅存放 GRUB 的第一阶段的代码,MBR 中的代码负责把 GRUB 的其余部分载入内存。
但是 GRUB 分成几段合适呢?要回答这个问题我们还得从 DOS 谈起。
DOS 的系统映像是不能跨柱面存放的,所以在 DOS 时代,磁盘的第一个分区索性并没有紧接在 MBR 的后面,而是直接从下一个柱面的边界开始。而且,按照柱面对齐,对系统的性能有很大好处,这对于现代操作系统同样适用。于是,在 MBR 与第一个分区之间,就出现了一块空闲区域。从那时起,这种分区方式成为了一个约定俗成,基本上所有的分区工具都把这种分区方式保留了下来。如果硬盘是 MBR 分区方案,用分区工具 fdisk 就可以看到这一点。
根据 fdisk 的输出可见,每个磁道划分为 63 个扇区。硬盘的第一个分区起始于第 63 个扇区(从 0 开始计数)。也就是说,对于第 0 个磁道,除了 MBR 占据的一个分区,其余 62 个分区是空闲的。
于是,GRUB 的开发人员就打算把 GRUB “嵌入”到这个空闲区域,这样做的好处就是相对来说比较安全。因为某些文件系统的一些特性或者一些修复文件系统的操作,有可能导致文件系统中的文件所在的扇区发生改变。因此,单纯依靠扇区定位文件是有一定的风险的。而对于 GRUB 来说,在其初始阶段,由于尚未加载文件系统的驱动,因此,它恰恰需要通过 BIOS 以扇区的方式访问 GRUB 的后续的阶段。但是,一旦 GRUB 嵌入到这个不属于任何分区的特殊区域,则将不再受文件系统的影响。当然将 GRUB 嵌入到这个区域也不是必须的,但是因为这个相对安全的原因,GRUB 的开发人员推荐将 GRUB 嵌入到这个区域。
但是这个区域的大小是有限的,通常,一个扇区 512 字节,一个柱面最多包含 63 个扇区。因此,除去 MBR ,这个区域的大小是 62 个扇区,即 31KB。因此,嵌入到这里的 GRUB 的映像最大不能超过 31KB 。为了控制嵌入到这个区域中的映像的尺寸不超过 31KB,GRUB 采用了模块化的设计方案。
GRUB 在嵌入的映像中包含硬件及文件系统的驱动,因此,一旦嵌入的映像载入内存,GRUB 即可访问文件系统。其他模块完全可以存储在文件系统上,通过文件系统的接口访问这些模块,避开了因为如修复文件系统而引起文件所在扇区的变化而带来的风险。另外也可以很好地控制嵌入到空闲扇区的映像的尺寸。
由上述内容可知,GRUB 将映像分为三个部分:MBR 中的 boot.img、嵌入空闲扇区的 core.img 以及存储在文件系统中的模块。这三个部分也对应着 GRUB 执行的三个阶段。在 MBR 分区模式下,以嵌入方式安装的 GRUB 的各个部分在硬盘上的分布如图5-1所示。
core.img 包括多个映像和模块,以从硬盘启动为例,core.img 包含的内容如图 5-2 所示。
2、安装GRUB
通常,在安装操作系统的最后,操作系统安装程序将会为用户安装 GRUB 。当然,有时我们也会手动安装 GRUB 。但是都是通过 GRUB 提供的工具,执行的命令如下:
grub-install /dev/sda
事实上,在这个安装命令的背后,GRUB 的安装过程分为两个阶段:第一阶段是创建 core.img ,GRUB 为此提供的工具是 grub-mkimage ;第二阶段是安装 boot.img 及 core.img 到硬盘,GRUB 提供的工具是 grub-setup 。为了方便,GRUB 将这两个过程封装到脚本 grub-install 中。