分析Linux系統的啓動過程

Linux系統的啟動過程:

BIOS自檢 —> grub引導程序 —> 加載內核 —> 執行init —> 啟動shell —> login登陸系統

系統啟動各個階段的詳細介紹:

一.BIOS自檢

計算機在接通電源之後首先由BIOS進行POST自檢,然後依據BIOS內設置的引導順序從硬盤、軟盤或CDROM中讀入引導塊。Linux系統是人BIOS中的地址oxFFFF0處開始引導的。BIOS的第1個步驟是加電POST自檢。POST的工作是對硬件進行檢測。BIOS的第2個步驟是進行本地設備的枚舉和初始化。BIOS由兩部分組成:POST代碼和運行時的服務。當POST完成之後,它被從內存中清理出來,但是BIOS運行時服務依然保留在內存中,目標操作系統可以使用這些服務。

BIOS運行時會按照CMOS的設置定義的順序來搜索處於活動狀態並且可以引導的設備。引導設備可以是軟盤、CD-ROM、硬盤上的某個分區、網絡上的某個設備甚至是USB閃存。通常,Linux系統都是從硬盤上引導的,其中主引導記錄(MBR)中包含主引導加載程序。MBR是一個512字節大小的扇區,位於磁盤上的第一個扇區(0道0柱面1扇區)。當MBR被加載到RAM中之後,BIOS就會將控制權交給MBR。

如果要查看MBR的內容,用戶需要以root用戶的身份運行如下命令:

#dd if=http://www.3lian.com/dev/had of=mbr.bin bs=512 count=1

讀入了1+0個塊

輸出了1+0個塊

#od –xa mbr.bin

… …

它從/dev/had(第一個IDE盤)上讀取前512個字節的內容,並將其寫入mbr.bin文件中。od命令會以十六進制和ASCII碼格式打印這個二進制文件的內容。

二.啟動GRUB/LILO

GRUB和LILO都是引導加載程序。引導加載程序用於引導操作系統啟動。當機器引導它的操作系統時,BIOS會讀取引導介質上最前面的512字節(主引導記錄)。在單一的MBR中只能存儲一個操作系統的引導記錄,所以當需要多個操作系統時就會出現問題,需要更靈活的引導加載程序。

所有引導加載程序都以類似的方式工作,滿足共同的目的,但LILO和GRUB之間也有很多不同之處:

LILO沒有交互式命令界面,而GRUB擁有;

LILO不支持網絡引導,而GRUB支持;

LILO將可以引導操作系統的信息存儲在MBR中。

如果修改了LILO配置文件,必須將LILO第一階段引導加載程序重寫到MBR。相對於GRUB,這是一個更為危險的選擇,因為錯誤配置的MBR可能會讓系統無法引導。使用GRUB時,如果配置文件配置錯誤,則只是默認轉到GRUB命令行界面。

三.加載內核

接下來的步驟就是加載內核映像到內存中,內核映像並不是一個可執行的內核,而是一個壓縮過的內核映像。通常它是一個zImage(壓縮映像,小於512KB)或是一個bzImage(較大的壓縮映像,大於512KB),它是提前使用zlib壓縮過的。在這個內核映像前面是一個例程,它實現少量硬件設置,並對內核映像中包含的內核進行解壓縮,然後將其放入高端內存中。如果有初始RAM磁盤映像,系統就會將它移動到內存中,並標明以後使用。然後該例程會調用內核,並開始啟動內核引導的過程。

四.執行init進程

init進程是系統所有進程的起點,內核在完成核內引導以後,即在本進程空間內加載init程序,它的進程呈是1。Init進程是所有進程的發起者和控制者。因為在任何基於Linux的系統中,它都是第一個運行的進程,所以init進程的編號(PID)永遠是1。

init進程有以下兩個作用。

init進程的第一個作用是扮演終結父進程的角色。因為init進程永遠不會被終止,所以系統總是可以確信它的存在,並在必要的時候以它為參照。如果某個進程在它衍生出來的全部子進程結束之前被終止,就會出現必須以init為參照的情況。此時那些失去了父進程的子進程就都會以init作為它們的父進程。

init的第二個作用是在進入某個特定的運行級別時運行相應的程序,以此對各種運行級別進行管理。它的這個作用是由/etc/inittab文件定義的。

五.通過/etc/inittab文件進行初始化

Init的工作是根據/etc/inittab來執行相應的腳本,進行系統初始化,如設置鍵盤、字體、裝載模塊,設置網絡等。

1./etc/rc.d/rc.sysinit

在init的配置文件中有如下一行:

si::sysinit:/etc/rc.d/rc.sysinit


分享到:


相關文章: