Write Your Own Operating System Tutorial(中文版) - Lesson 6: Boot Loader

 Lesson 6: Boot Loader


    到現在爲止,我們所做的都被限制在引導扇區裏面。如果我們的操作系統只能容納在一個扇區裏,那它絕對大不了。我們需要有個方法來拓展。我們將通過寫一個程序來讀取並且運行一個可執行文件,以達到這個目標。這個程序稱爲boot loader。我們希望讀取的那個程序的大小可以隨我們的希望而定,因爲它不再受一個扇區大小的限制了。

這將比我們已經完成的工作都要難。在FAT文件系統中指定一個參考點可能是個好主意(你有可能正使用其他文件系統,不過假定你使用FAT)。我將簡單介紹一下啓動加載過程。

一張軟盤依次包含下面的部分:DOS的引導記錄(我們已經在上面忙活了半天的那第一個扇區),文件分配表(FAT),根目錄,然後是磁盤上的文件。(硬盤的話更復雜一點,它包含一個主引導記錄Master Boot Record和多個分區。)設想我們現在已經寫好了操作系統,編譯並且命名爲LOADER.BIN,然後把它複製到磁盤上。boot loader將如下所示的加載它。

DOS引導記錄(DBR)將讀取DBR,FAT,和根目錄的大小。它們在磁盤上的位置便相應的確定了。
把根目錄讀入內存。
在根目錄裏尋找名爲LOADER.BIN的文件。如果找到了,我們將讀取目錄信息來獲知文件的第一個簇(文件分配的單位)在哪裏。如果沒有找到,給出一條錯誤信息。
把文件分配表讀入內存。
從文件第一個簇開始,藉由文件分配表我們可以找到這個文件所有的簇。我們把這些簇讀到內存中特定的位置。
我們跳轉到那裏,然後開始執行操作系統。
所有的讀盤工作都將通過BIOS完成。如果你願意接受挑戰,找本關於BIOS函數的指南來學學如何從磁盤上讀取扇區,然後試着寫一個自己的boot loader。不過,我也提供了一個從John S. Fine那裏得到並且稍做改變了的FAT12 bootstrap loader。如果你能找到一份他的“partcopy”,那你就可以按他寫的編譯和安裝指令做了(請告訴我你是在哪裏找到的)。否則,用我們在前幾課的方法,來把這個boot loader複製到軟盤上。

在John Fine的bootstrap loader中有很多可供用戶設置的參數。這個加載器假定你使用FAT12文件系統(這是軟盤使用的文件系統)。對於其他的系統來說,你需要不同的加載器。你能夠設置的參數包括操作系統的位置,把什麼樣的FAT數據讀入內存。你也可以改變加載器讀入的文件名。

默認情況下,加載器將在根目錄(如果有的話)下找到名爲LOADER.BIN的文件,並且把它讀到以0x1000:0000(這可以通過改變%define IMAGE_SEG調節)開始的內存中。這樣你就能夠編一個操作系統,並且把它命名爲LOADER.BIN複製到軟盤上。

作爲舉例,我們將使用boot loader來加載我們第四課的Hello,World操作系統。但是我們不能僅僅使用和第四課一樣的文件。我們需要稍做改變。首先你需要意識到這個文件現在被加載到了不一樣的位置(原來是0000:7C00,現在是0x1000:0000)。其次,我們可以去掉DOS引導記錄的數據了。

在代碼的一開始,你可以設置數據段和堆棧段以及堆棧的指針。下面的代碼完成這些。當前的代碼段由CS寄存器存儲,同時靜態數據也被組裝在可執行代碼中,所以我們也可以認爲這個段是數據段。同時,我們還可以把它當作堆棧段來用,不過將來我們可能要改變。

       mov    ax, cs        ; 得到當前段

       mov    ds, ax        ; 數據也在當前段裏

       cli                  ; 變動堆棧時屏蔽掉中斷

       mov    ss, ax        ; 我們也把這個段當做堆棧段來用

       mov    sp, 0xfffe    ; 將段的頂部作爲堆棧的開始

       sti                  ; 恢復中斷

 

最後,我們可以把源碼最後的幾行去掉了。包括添加引導扇區署名和檢查文件是否正好爲一個扇區大小的代碼。其他的代碼應該都差不多。結果可以在lesson6.asm下載。

用下面的命令編譯這個文件並且把它複製到你得磁盤上:

nasmw lesson6.asm -o lesson6.bin

copy lesson6.bin a:/LOADER.BIN

 

然後,如果你已經安裝了boot loader,你就可以用這張盤啓動了。如果你獲得了成功,修改一下前幾課的其他程序來使boot loader能夠加載它們。以後的絕大多數課程裏,我將假定你使用這個boot loader(當然也可以是其他你選擇的)來載入你的操作系統文件。

現在,我們可以使我們的操作系統比一個扇區更大了!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章