第十一课:GRUB与vmlinuz的结构

在机器加电后, BIOS 会进行自检,然后由 BIOS 加载引导设备中的引导扇区。Linux系统下下,引导扇区通常是安装 GRUB 的一小段程序。最后 GRUB 会加载Linux 的内核映像 vmlinuz:

 

 

BIOS GRUB

Linux通常是从硬盘中启动的,硬盘上第一个扇区(每个扇区 512 字节空间),被称为 MBR (主启动记录),其中包含有基本的 GRUB 启动程序和分区表,安装 GURB 时会自动写入到这个扇区,当MBR BIOS 装载到 0x7C00地址开始的内存空间后, BIOS 将控制权转交给了 MBR 。内核源码自此开始:

流程如下:

1) 众所周知, CPU 只能运行内存中的程序,如果想要运行硬盘或 U 盘中的程序,通常将程序加载到 RAM 中。但是 RAM 在断电后就没法保存数据了。所以硬件工程师在设计 CPU 时,硬性的规定在加电的瞬间,强制将 CS 寄存器的值设置为 0xF000IP 寄存器的值设置为 0xFFF0。在物理地址为 0xFFFF0处连接了一小块 ROM 芯片, BIOS 被固化在其中。

2) 现在, CS : IP 指向 0xFFFF0 这个位置,正是 BIOS 程序的入口地址, BIOS 正式开始启动。

3) BIOS 一开始会初始化 CPU

4) 接着检查并初始化内存,将自己的一部分复制到内存,最后跳转到内存中运行。

5) 接下来 BIOS 枚举本地设备进行初始化,并进行相关的检查,检查硬件是否损坏,这期间 BIOS 会调用其他设备上的固件程序。

6) 当设备初始化和检查步骤完成之后, BIOS 会在内存中建立中断表和中断服务程序,这是启动 Linux 至关重要的工作,因为 Linux 会用到它们。

具体操作为:BIOS 从内存地址(0x00000)开始用 1KB 的内存空间(0x00000 ~ 0x003FF)构建中断表,在紧接着中断表的位置,用 256KB 的内存空间构建 BIOS 数据区(0x00400 ~ 0x004FF),并在 0x0e05b 的地址加载了 8KB 大小的与中断表对应的中断服务程序。

 

GRUB 是如何启动的

MBR 中只有, 512 字节,其中还有 64 字节的分区表加 2 字节的启动标志,剩下的 446 字节空间无法装下 GRUB 这种大型通用引导器。

于是, GRUB 的加载分成了多个步骤,同时 GRUB 也分成了多个文件,其中最重要的是 boot.img corc.img 。如下图所示:

 

其中, boot.img GRUB 的安装程序写入到硬盘的MBR 中,同时在 boot.img 文件中的一个位置写入 core.img 文件占用的第一个扇区的扇区号。

core.img 文件是由 GRUB 安装程序根据安装环境时的环境信息,用其他 GRUB 的模块文件动态生成。如下图所示:

 

1) 如果从硬盘启动的话, core.img 中第一个扇区的内容就是 diskboot.img 文件,diskboot.img 文件的作用是读取 core.img 中剩余的部分到内存中。

2) 由于这时 diskboot.img 文件还不能识别文件系统,所以将 core.img 文件的全部位置以文件块列表的形式保存到 diskboot.img 文件中。以此确保 diskboot.img 文件找到 core.img 文件的剩余内容。

3) 将控制权交给 kernel.img 文件

4) 此时, core.img 文件中嵌入了足够多的功能模块,可以保证 GRUB 识别出硬盘分区上的文件系统,能够访问 /boot/grub 目录,并且可以加载相关的配置文件和功能模块,来实现相关功能。

GRUB2 大量使用了动态加载功能模块,使得 core.img 文件的体积变得足够小。而 GRUB 的 core.img 文件一旦开始工作,就可以加载 Linux 系统的 vmlinuz 内核文件。

 

 

 

 2.1 详解 vmlinuz 文件结构

vmlinuz 文件是由 bzImage 文件复制而来的,由下面的代码可知生成 bzImage 文件需要三个依赖文件:setup.binvmlinux.binlinux/arch/x86/boot/tools 目录下的 build

 

build 只是一个 HOSTOS(正在使用的 Linux)下的应用程序,它的作用就是将 setup.binvmlinux.bin 两个文件拼接成一个 bzImage 文件,如下图所示:

 

至于 Makefile 如何形成这俩文件,已经跟着课程看过了,没有记录必要,如果未来的自己看到这篇笔记,又不知道怎么形成,回去看课程就好。

1.2 实践篇

1)  linux 目录下:make ARCH=x86_64

2) 再执行 make install,就会产生 vmlinux 文件

编译太慢了,这里不做记录了,等我编译完 linux 源码自然就能看到这个文件。

posted @ 2021-11-26 16:55  一只吃水饺的胡桃夹子  阅读(430)  评论(0编辑  收藏  举报