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