前言
最近在研究使用grub引导自制操作系统时,发现grub链式引导过程中向boot传递的硬盘分区表表项数据有疑问,特此记录下。
一、主引导记录(MBR)
MBR是存储在计算机硬盘的第一个物理扇区的512字节的数据块,它包含了引导程序、分区表、主引导扇区结束标志AA55H三部分。其中引导程序占用446字节,分区表占用64字节(16字节每项×4项),主引导扇区结束标志AA55H占2字节。
二、主引导记录分区表
主引导记录分区表共4个表项,每个表项占用16字节。具体含义如下:
其中分区表表项0字节处标记当前是否是启动分区;
4字节处表示分区的类型,各值的具体含义如下:
00H——表示该分区未用(即没有指定);
06H——FAT16基本分区;
0BH——FAT32基本分区;
05H——扩展分区;
07H——NTFS分区;
0FH——(LBA模式)扩展分区(83H为Linux分区等)
8字节开始的4个字节表示该分区的起始扇区LBA。
注:在主引导记录的硬盘分区表中的起始扇区LBA是相对于物理0号扇区的偏移量。
三、扩展分区引导记录(EBR)
主引导记录的分区表共有4个表项,也就是说一个硬盘最多有四个主分区,当需要更多分区时怎么办呢? 微软给出的解决方案是引入扩展分区,它与主分区为并列的关系,占用主引导记录的分区表的一个表项。每个扩展分区最多可放16个逻辑分区,每个EBR对应一个逻辑分区,也就是说每个扩展分区中是有多个EBR的。扩展分区的第一个逻辑分区的EBR放在扩展分区的0号扇区
,EBR的各部分组成与MBR完全一致,但是EBR中分区表的用途不同。EBR分区表只用前两个表项,第一个表项描述了当前逻辑分区的起始扇区、扇区数目等信息,第二个表项描述的是下一个EBR所在的位置。
如图所示,扩展分区中各个EBR的组织类似于链表的形式,分区表第一项记录着当前逻辑分区的信息,分区表第二项记录着下一个逻辑分区的EBR所在的位置,但是需要注意的是扩展分区中所有EBR的分区表表项中的起始扇区LBA
记录的是相对偏移量,是相对于上一个逻辑分区的偏移,例如主分区表中有一个扩展分区表项(假设sda2),该扩展分区下有三个逻辑分区(sda5、sda6、sda7),假设主分区表中扩展分区表项的起始扇区LBA
为2048,三个逻辑分区EBR中表项的第一项的起始扇区LBA
分别为128、256、512,则sda5的起始扇区LBA=2048+128
,则sda6的起始扇区LBA=2048+128+256
,则sda7的起始扇区LBA=2048+128+256+512
。
GRUB链式引导过程中向boot传递的分区表项存在的问题
当启动分区为主分区时,GRUB向boot传递的是MBR分区表中的主分区表项,该表项的起始扇区LBA
就是物理扇区号。
当启动分区为扩展分区的逻辑分区时,GRUB向boot传递的是EBR分区表中的描述逻辑分区的表项,该表项中的起始扇区LBA
是相对于上一个逻辑分区起始扇区的偏移量,因此grub仅仅传递扩展分区中逻辑分区的分区表表项是无法计算出当前逻辑分区的物理起始扇区的。