本文僅簡單介紹Linux的啟動過程,在此基礎上做簡要的分析。對於Linux啟動過程中內部詳細的函數調用不做介紹,只是希望本文能給新手起到一個拋磚引玉的作用,以便深入研究Linux的啟動過程。下圖基本展示了Linux啟動的基本過程,僅為個人學習總結得出,如有大神拍磚,表示歡迎。
一. BIOS自檢:
應當理解的一些常識:
BIOS的組成是由兩大部分組成的:POST(power on system test)代碼和運行時的服務;
POST的工作目的是對硬件進行檢測;
1. 當計算機加電后,首先由BIOS進行POST(power on system test)自檢。
即第一步驟就是加電,POST自檢。然后依據BIOS內設置的引導順序從硬盤,軟盤,或CDROM中讀入引導塊;
2. BIOS的第二個步驟是進行本地設備的枚舉和初始化。
通常Linux系統都是從硬盤上引導的,其中主引導目錄(MBR)中包含着主引導目錄加載程序,MBR是一個512字節大小的扇區,位於磁盤上的一個扇區。 即:每個磁盤的第一個扇區為磁盤的MBR,MBR中前446字節記錄的是boot loader,boot loader中安裝的是grub的stage1,用於指向grub主程序咋磁盤中的位置。開機加電之后,BIOS按照boot sequence找到對應磁盤,然后搜索該磁盤的MBR。找到位於基本磁盤分區的grub程序,即進入stage2階段,按照grub.conf配置文件對kernel以及initrd進行引導加載。當MBR被加載到RAM中之后,BIOS就會將控制權交給MBR。
查看MBR中的內容:(前提是root用戶)
dd if=/dev/sda of=mbr.bin bs=512 count=1
od –xa mbr.bin
查看到的內容為(均為二進制):
二.啟動GRUB/LILO
GRUB和LILO都是引導加載程序,主要用於引導操作系統的啟動。
在單一的MBR中只能存儲一個操作系統的引導記錄,所以當需要多個操作系統時,就會出現問題,需要更靈活的引導加載程序。
GRUB和LILO的區別:
GRUB擁有交互式命令界面;
GRUB支持網絡引導;
LILO可以引導操作系統位置的信息存儲在MBR中;
*:如果LILO的配置文件出現錯誤,會導致系統無法啟動;而當使用GRUB時,如果配置文件出現錯誤,則系統會默認轉到GRUB命令界面。
GRUB的配置文件: /boot/grub/grub.config
像上圖一樣,輸入 cat grub.conf 之后,按下Enter鍵:
三.加載內核:
加載內核映像到內存中,內核映像並不是一個可執行的內核,而是一個可壓縮的內核映像。在這個內核映像前面是一個例程,它實現少量硬件設置,並對內核映像中包含的內核進行解壓縮,然后將其放入高端內存中。如果有初始化RAM磁盤映像,系統就會將它移動到內存中,並標明以后使用,然后到該例程會調用內核,並開始啟動內核引導的過程。
四. 執行init進程
init進程是系統所有進程的起點,是所有進程的發起者和控制者。因為在任何基於Linux的操作系統中,它都是第一個運行的進程,所以,init進程的進程編號(PID)永遠是1.
內核在完成核內引導以后,即在本進程空間內加載init程序,它的進程號是1,主要用來執行一些開機初始化腳本和監視進程。如:init讀取系統引導配置文件/etc/inittab中的信息進行初始化。
關於init進程的作用:
- 扮演終結父進程的角色:因為init進程永遠不會終止,所以系統總是可以確認它的存在,並在必要的時候以它為參照;
- 在進入某個特定的運行級別時,運行相應的程序,以及對各種運行級別進行管理,它的這個作用由文件/etc/inittab定義的。
五. 關於其它
/etc/rc.d/rc.sysinit 系統初始化腳本;
/etc/rc.d/rcX.d/[KS] * - 根據運行級別X分配服務;終止以“K”開頭的服務,啟動以“S”開頭的服務;
/etc/rc.d/rc.local 執行本地特殊配置;
最后是其他服務。
作者:itRed
博客URL:http://www.cnblogs.com/itred
學習交流郵箱:it_red@sina.com
本博客您可以自由轉載,但請保留原作者信息和文章鏈接URL。
推薦參考閱讀:
《6 Stages of Linux Boot Process (Startup Sequence)》 http://www.thegeekstuff.com/2011/02/linux-boot-process/
《Linux Booting Process》http://resources.infosecinstitute.com/linux-booting-process/