OS开发笔记(2)——GRUB发动流程
GRUB怎样打破实方式的约束
BIOS与MBR引导机制
BIOS会在发动时,查看逻辑0扇区(即硬盘的榜首个扇区)的结束是否存在标志 0x55
, 0xaa
,以此判别该扇区是否可引导。依照传统的MBR(Master Boot Record)引导流程,逻辑0扇区包括一个特别的引导程序。这个程序的使命是查看坐落逻辑0扇区偏移 0x1BE
处的分区表。分区表最多能够记载四个分区,这也是为什么 MBR 分区的硬盘只能有四个主分区的原因。
在分区表中,每个分区能够有一个“可引导”符号。MBR引导程序会依据某种规矩选取一个被符号为“可引导”的分区,将该分区的榜首个扇区(称为VBR,Volume Boot Record)加载到内存中(一般加载到地址 0x7C00
以确保兼容性)。随后,程序跳转到VBR,由VBR担任加载并发动该分区中的操作体系。
MBR和VBR的局限性
但是,MBR和VBR的巨细都仅有一个扇区,也便是512字节,这对略微杂乱的引导程序来说现已不够用。此外,在16位实方式下,CPU的寻址规模最大只要1MB(实践可用空间还小于1MB,需考虑BIOS和其他数据占用)。因而,关于体积超越1MB或需求加载到1MB以上地址的内核文件,MBR和VBR的才能缺乏。
16位的寻址约束
切换到保护方式尽管能够打破1MB寻址规模的约束,但由于仅实方式支撑调用BIOS功用,在保护方式下无法直接调用BIOS来完结硬盘驱动和文件体系管理。这就需求自行完结这些功用,极大地增加了引导程序的杂乱度。为了防止在引导内再完结一边磁盘驱动和文件体系,我挑选了运用GRUB。
GRUB的解决方案
在GRUB中,将被称为stage1.5
阶段的GRUB中心加载器(从磁盘发动是diskboot
,从光盘是cdboot
等等)寄存在寄存磁盘中的某个闲暇空间(默许是MBR后的一个扇区),一个定制的MBR引导程序(如 boot.S
,编译后生成 boot.img
)担任加载这一阶段的程序到内存中。
这时候就又呈现一个问题,怎样寄存GRUB中心呢?GRUB供给了两种方法:
- 运用磁盘未分配空间
GRUB将包括中心功用的core.img
写入硬盘上未被分区表区分的闲暇空间。 - 依据文件体系引导
core.img
被当作一个一般文件存储在文件体系中,由MBR程序加载到内存中。
GRUB怎样找到core.img
假如选用依据文件体系的方法,问题在于MBR程序怎样知道 core.img
的具体方位。GRUB 的core.img
是经过grub-mkimage
指令生成的,它由多个部分组成,包括:
- diskboot:担任从磁盘加载
core.img
的榜首部分,巨细为一个扇区。 - decompresser:用于解压
grub-core
,以支撑紧缩后的存储方式。 - core:中心程序模块,能够依据需求加载各种功用扩展(grub模块)。
当履行 grub-install
时,东西会主动将 diskboot
的方位写入 boot.img
中。diskboot
的结尾包括一个 blocklist
,用于记载 grub-core
的各个部分在磁盘上的方位。这样,diskboot
能够顺畅加载完好的 grub-core
。
GRUB的引导进程
综上,GRUB 2 的发动流程如下:
- MBR引导
BIOS 加载 MBR(即boot.img
),运转其间的引导程序。 - 加载diskboot
MBR 程序依据记载的方位加载diskboot
。 - 加载并解压grub-core
diskboot
依据blocklist
读取并加载grub-core
,必要时解压。 - 发动操作体系内核
grub-core
终究加载方针操作体系的内核文件,并完结引导。
感触
略微深化了解过GRUB后,感觉像是迷你内核相同,功用这么丰厚。