接上一篇
实际上在512字节的MBR中,真正可用的空间并不多。除了一开始的跳转指令外,起始部分是一个被称为BPB的区域,即BIOS参数块(BISO Parameter Block)。主要是FAT和NTFS文件系统会使用这块区域。所以GRUB在安装时会避开BPB,这也是为什么一开始就跳转到偏移量0x65处,这里才是真正的开始代码。而MBR被装载到内存中后,BPB对应的内存区域就被GRUB利用来存放DAP,即磁盘地址数据包(Disk Address Packet),用于提供参数给BIOS中断0x13来读取磁盘数据。
boot.S完成了对1号扇区的装载。而1号扇区安装的是bootdisk.img,也是正好512字节,由bootdisk.S编译生成。
bootdisk.S的任务是加载GRUB余下的所有映像到内存。通常情况下GRUB安装时除了0号、1号扇区外还会使用2-62号扇区。这些扇区不被硬盘分区和文件系统使用,应该来说是GRUB最佳的安装地点。但是有一些特殊的软件会在这里记录一些数据,如需要存放加密或授权信息的一些私有软件。所以并不能说完全安全。
GRUB使用的扇区号会记录在一系列列表里,每个列表12个字节记录了一段连续的扇区的起始号码和长度。这些列表在GRUB安装时会添加在bootdisk.img代码段的后面。在bootdisk.S中通过两个嵌套循环,来把这些扇区装载在地址0x70000开始的内存区域。然后同样使用copy_buffer复制这些数据到地址0x8200开始的内存区域。这里0x70000开始的内存区域是作为缓冲区来使用的。因为BIOS装载扇区时不能越过64K字节的边界,如果直接装载到0x8200就可能会超过0x10000。
装载完成后,执行跳转指令ljmp $0, $(GRUB_BOOT_MACHINE_KERNEL_ADDR + 0x200)跳转到地址0x8200执行下一条指令。
至此bootdisk.img的代码执行完毕。