0.11之路(一):BIOS引導過程

劉秋杉發表於2015-04-09

BIOS在記憶體最開始的位置構建中斷向量表,緊接著是BIOS資料區,此外還要有與中斷向量表相應的中斷服務程式。我們正是利用這些中斷服務程式把核心載入到記憶體中。
中斷是作業系統裡的一個意義重大的概念,是一個技術手段。

載入核心程式併為保護模式做準備

對於Linux 0.11來說,計算機將分三批次逐次載入作業系統的核心程式碼,第一批由BIOS中斷 int 0x19 把第一扇區 bootsect 的內容載入到記憶體;第二批、第三批在bootsect的指揮下,分別把其後的4個扇區和隨後的240個扇區的內容載入至記憶體。

先來看一下 int 0x19 指向的中斷服務程式 —— “啟動載入服務程式”。首先這個程式是BIOS事先設計好的,程式碼是固定的,與作業系統無關,它的目的就是找到軟盤並載入第一扇區
所以BIOS是獨立於作業系統的。

接著就是將第一扇區載入到記憶體 0x07C00 的位置,作業系統出現了。
這個扇區裡存放的是 Linux 0.11 的載入程式(俗稱bootloader)。

這裡要區分一下:BIOS和bootloader是不同的。BIOS之後,bootloader開始工作。在PC上bootloader分為兩部分:第一階段載入程式位於主開機記錄(MBR),用以引導位於某個分割槽上的第二階段載入程式,如NTLDR、BOOTMGR和GNU
GRUB等。所以我們經常見到的grub就屬於bootloader,當然它不是BIOS。
在ARM板移植時,我們通常會對uboot進行裁剪,使得這個板子擁有合適的bootloader,但與PC不同的是,對於嵌入式Linux來說,並沒有BIOS,而是直接從flash中執行bootloader,然後裝載核心,所以省去了BIOS。

於是第一扇區就稱為啟動扇區(boot sector)。第一扇區的載入,標誌著 Linux 0.11 中的程式碼即將發揮作用。第一扇區中的程式碼是彙編程式 bootsect.s ,這是計算機開機以來,記憶體中第一次有了 linux 作業系統自己的程式碼,雖然只是啟動程式碼。

到目前流程是這樣的:
開機——BIOS——bootsect.s

對BIOS開發人員來說,他們只需要做到:接到啟動作業系統的命令後,只從啟動扇區把程式碼載入到0x07C00位置,至於這個扇區中存放的是不是作業系統的載入程式,則不管,將責任推給使用者。也就是說使用者要確保正確安裝了作業系統。而作業系統的設計者必須把最開始執行的程式“定位”在啟動扇區,其餘的程式則可以根據具體的作業系統而有不同的設計。

相關文章