BIOS調(diào)用一個專門的程序,這個程序的任務(wù)就是把操作系統(tǒng)的內(nèi)核調(diào)入內(nèi)存。這個程序就叫做自舉程序(Boot Loader)。在我們繼續(xù)下面內(nèi)容之前,先來看一下啟動系統(tǒng)的不同途徑。
1.從軟盤啟動Linux
從軟盤啟動時,存儲在軟盤第一扇區(qū)的指令將被加載并執(zhí)行。這個指令然后就會把其余的內(nèi)核復(fù)制到內(nèi)存中。
Linux內(nèi)核可以裝在1.44MB的軟盤里,不過為了減少磁盤占用量,它們都進行了壓縮。這個壓縮過程是在編譯時完成的,而解壓縮的過程則由自舉程序完成。
從軟盤啟動Linux時,自舉程序要做的工作非常簡單。它是一個位于/usr/src/linux-2.4.2/arch/i386/boot/bootsect.S的匯編語言文件。當(dāng)我們編譯Linux內(nèi)核源代碼,或者獲取一個新的內(nèi)核時,這個可執(zhí)行的匯編代碼就會被放在內(nèi)核程序的前端。由此可見,要制作一個可啟動的Linux軟盤其實很簡單。我們只要從磁盤的第一個扇區(qū)拷貝Linux內(nèi)核,就可以創(chuàng)建一個可啟動軟盤。當(dāng)BIOS加載軟盤的第一個扇區(qū)時,它實際上拷貝的是自舉程序。自舉程序由BIOS調(diào)用(跳到物理地址為0x00007c00的位置),然后執(zhí)行以下的操作:
(1)把自已從地址0x00007c00移動到0x00090000;
(2)使用地址0x00003ff4,創(chuàng)建“實模式”棧;
(3)設(shè)置磁盤參數(shù)表,這里使用的是BIOS提供的軟盤驅(qū)動程序;
(4)通過調(diào)用BIOS程序顯示“Loading”信息;
(5)自舉程序調(diào)用BIOS程序來加載軟盤上內(nèi)核的setup()函數(shù),并把它放在起始地址為0x00090200的內(nèi)存中;
(6)接下來自舉程序調(diào)用一個BIOS程序,這個程序從軟盤加載剩余的內(nèi)核程序,并將其放入起始地址為0x00010000(所謂的低地址)或者0x00100000(所謂的高地址);
(7)然后,跳轉(zhuǎn)到setup()函數(shù)。
2.從硬盤啟動Linux
當(dāng)系統(tǒng)從硬盤啟動時,啟動過程又有所不同。硬盤的第一個扇區(qū)叫做MBR(Master Boot Record),其上存儲著分區(qū)表和一個小程序。這個程序加載存儲由操作系統(tǒng)的第一扇區(qū)來開始啟動。Linux是一個高度靈活且非常優(yōu)秀的軟件,所以在MBR里,它使用一個叫做LILO的程序來代替上述的那個程序。LILO允許用戶選擇所要啟動的操作系統(tǒng)。
一般來說,Linux是從硬盤啟動的。這就需要不同的自舉程序。在Intel系統(tǒng)里,用得最多的自舉程序就是LILO。對于其它的體系結(jié)構(gòu),還存在著別的自舉程序。LILO可以安裝在MBR上(請注意:在安裝Red Hat Linux時,有一個步驟會讓用戶選擇把LILO安裝到MBR或者引導(dǎo)扇區(qū))或一個活動分區(qū)的引導(dǎo)扇區(qū)上。
由于LILO太大,MBR無法容納,所以它被分成兩部分。MBR(或者磁盤分區(qū)的引導(dǎo)扇區(qū))包含有一個小的自舉程序,它被BIOS載入到起始地址為0x00007c00的內(nèi)存中。然后,這個小程序再把自己移到0x0009a000地址處,接著設(shè)置實模式棧,最后加載第二部分的LILO自舉程序(請注意:實模式棧地址范圍是0x0009b000 到 0x0009a200)。
第二部分的LILO會從磁盤讀取所有可用的操作系統(tǒng),并且給用戶列出,以選擇所要啟動的系統(tǒng)。一旦用戶選擇完成,自舉程序就會加載相應(yīng)的扇區(qū)內(nèi)容到內(nèi)存中并且執(zhí)行之。
自舉程序被BIOS調(diào)用時(跳到物理地址為0x00007c00處),要執(zhí)行以下操作:
(1)把自已從地址0x00007c00移動到0x00090000;
(2)使用地址0x00003ff4,創(chuàng)建“實模式”棧;
(3)設(shè)置磁盤參數(shù)表。這里使用的是BIOS提供的軟盤驅(qū)動程序;
(4)通過調(diào)用BIOS程序顯示“Loading Linux”信息;
(5)自舉程序調(diào)用BIOS程序來加載軟盤上內(nèi)核的setup()函數(shù),并把它放在起始地址為0x00090200的內(nèi)存中;
(6)接下來自舉程序調(diào)用一個BIOS程序,這個程序從軟盤加載剩余的內(nèi)核程序,并將其放入起始地址為0x00010000或者0x00100000;
(7)然后,跳轉(zhuǎn)到setup()函數(shù)。


