接上一篇
實(shí)際上在512字節(jié)的MBR中,真正可用的空間并不多。除了一開(kāi)始的跳轉(zhuǎn)指令外,起始部分是一個(gè)被稱為BPB的區(qū)域,即BIOS參數(shù)塊(BISO Parameter Block)。主要是FAT和NTFS文件系統(tǒng)會(huì)使用這塊區(qū)域。所以GRUB在安裝時(shí)會(huì)避開(kāi)BPB,這也是為什么一開(kāi)始就跳轉(zhuǎn)到偏移量0x65處,這里才是真正的開(kāi)始代碼。而MBR被裝載到內(nèi)存中后,BPB對(duì)應(yīng)的內(nèi)存區(qū)域就被GRUB利用來(lái)存放DAP,即磁盤(pán)地址數(shù)據(jù)包(Disk Address Packet),用于提供參數(shù)給BIOS中斷0x13來(lái)讀取磁盤(pán)數(shù)據(jù)。
boot.S完成了對(duì)1號(hào)扇區(qū)的裝載。而1號(hào)扇區(qū)安裝的是bootdisk.img,也是正好512字節(jié),由bootdisk.S編譯生成。
bootdisk.S的任務(wù)是加載GRUB余下的所有映像到內(nèi)存。通常情況下GRUB安裝時(shí)除了0號(hào)、1號(hào)扇區(qū)外還會(huì)使用2-62號(hào)扇區(qū)。這些扇區(qū)不被硬盤(pán)分區(qū)和文件系統(tǒng)使用,應(yīng)該來(lái)說(shuō)是GRUB最佳的安裝地點(diǎn)。但是有一些特殊的軟件會(huì)在這里記錄一些數(shù)據(jù),如需要存放加密或授權(quán)信息的一些私有軟件。所以并不能說(shuō)完全安全。
GRUB使用的扇區(qū)號(hào)會(huì)記錄在一系列列表里,每個(gè)列表12個(gè)字節(jié)記錄了一段連續(xù)的扇區(qū)的起始號(hào)碼和長(zhǎng)度。這些列表在GRUB安裝時(shí)會(huì)添加在bootdisk.img代碼段的后面。在bootdisk.S中通過(guò)兩個(gè)嵌套循環(huán),來(lái)把這些扇區(qū)裝載在地址0x70000開(kāi)始的內(nèi)存區(qū)域。然后同樣使用copy_buffer復(fù)制這些數(shù)據(jù)到地址0x8200開(kāi)始的內(nèi)存區(qū)域。這里0x70000開(kāi)始的內(nèi)存區(qū)域是作為緩沖區(qū)來(lái)使用的。因?yàn)锽IOS裝載扇區(qū)時(shí)不能越過(guò)64K字節(jié)的邊界,如果直接裝載到0x8200就可能會(huì)超過(guò)0x10000。
裝載完成后,執(zhí)行跳轉(zhuǎn)指令ljmp $0, $(GRUB_BOOT_MACHINE_KERNEL_ADDR + 0x200)跳轉(zhuǎn)到地址0x8200執(zhí)行下一條指令。
至此bootdisk.img的代碼執(zhí)行完畢。
下一篇
新聞熱點(diǎn)
疑難解答
圖片精選