接上一篇
實際上在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的代碼執行完畢。
下一篇
新聞熱點
疑難解答