0.11之路(二):載入setup

劉秋杉發表於2015-04-10

BIOS將bootsect這個載入程式載入記憶體後,接下來就要靠bootsect來載入第二批和第三批程式。

bootsect首先要做的工作就是規劃記憶體
真實模式下,定址最大範圍是1MB(0xFFFFF)。關於setup程式,在bootsect.s中要指定setup程式的扇區數和被載入到的位置(0x90200),此外還要指定啟動扇區(也就是bootsect.s)被BIOS載入的位置(0x07c00)和將要移動到的新位置(0x90000),核心被載入的位置(0x10000)和核心的末尾位置,根檔案系統裝置號(ROOT_DEV=0x306,第二個硬碟第一個分割槽)。
這就是記憶體規劃,可以確保互不重疊。

bootsect的第一步是將自身從0x07c00的位置複製到0x90000的位置。
第二步就是將setup程式載入至記憶體中。

載入bootsect,BIOS需要 int 0x19 這個中斷向量。載入setup,則要藉助BIOS提供的 int 0x13 中斷向量所指向的中斷服務程式——磁碟服務程式。二者不同的是, int 0x19指向的啟動載入服務程式是BIOS執行的,而 int 0x13指向的磁碟服務程式是linux自身的啟動程式碼bootsect執行的。前者只負責把第一扇區的程式碼載入到0x07C00位置,而後者的中斷服務程式則根據設計者的意圖,把指定扇區的程式碼載入到記憶體的指定位置。所以對於 int 0x13 來說,要事先將指定的扇區、載入的記憶體位置等資訊傳遞給中斷服務程式。

複製後的bootsect的起始位置是0x90000,佔用512B,因此,0x90200緊挨著bootsect的尾部,所以bootsect和setup是連在一起的。setup程式佔據四個扇區,這樣加上bootsect,一共載入了五個扇區。bootsect程式碼執行完畢後就開始執行setup。

相關文章