1. Linux 啟動過程              

        當(dāng)系統(tǒng)首次引導(dǎo)時,或系統(tǒng)被重置時,處理器會執(zhí)行一個位于已知位置處的代碼。在個人計算機(jī)(PC)中,這個位置在基本輸入/輸出系統(tǒng)(BIOS)中,它保存在主板上的閃存中。嵌入式系統(tǒng)中的中央處理單元(CPU)會調(diào)用這個重置向量來啟動一個位于閃存/ROM 中的已知地址處的程序。在這兩種情況下,結(jié)果都是相同的。因為 PC 提供了很多靈活性,BIOS 必須確定要使用哪個設(shè)備來引導(dǎo)系統(tǒng)。稍后我們將詳細(xì)介紹這個過程。

        當(dāng)找到一個引導(dǎo)設(shè)備之后,第一階段的引導(dǎo)加載程序就被裝入 RAM 并執(zhí)行。這個引導(dǎo)加載程序在大小上小于 512 字節(jié)(一個扇區(qū)),其作用是加載第二階段的引導(dǎo)加載程序。

      當(dāng)?shù)诙A段的引導(dǎo)加載程序被裝入 RAM 并執(zhí)行時,通常會顯示一個動畫屏幕,并將 Linux 和一個可選的初始 RAM 磁盤(臨時根文件系統(tǒng))加載到內(nèi)存中。在加載映像時,第二階段的引導(dǎo)加載程序就會將控制權(quán)交給內(nèi)核映像,然后內(nèi)核就可以進(jìn)行解壓和初始化了。在這個階段中,第二階段的引導(dǎo)加載程序會檢測系統(tǒng)硬件、枚舉系統(tǒng)鏈接的硬件設(shè)備、掛載根設(shè)備,然后加載必要的內(nèi)核模塊。完成這些操作之后啟動第一個用戶空間程序(init),并執(zhí)行高級系統(tǒng)初始化工作。


                                  
                                                               Linux啟動過程(ZZ)
            
 2.什么是initrd
   
       initrd 的英文含義是 boot loader initialized RAM disk,就是由 boot loader 初始化的內(nèi)存盤,是在系統(tǒng)引導(dǎo)過程中掛載的一個臨時根文件系統(tǒng),用來支持兩階段的引導(dǎo)過程。initrd 映像中包含了支持 Linux 內(nèi)核兩階段啟動過程所需要的必要可執(zhí)行程序和系統(tǒng)文件。
      內(nèi)核引導(dǎo)過程中,初始 RAM 磁盤(initrd)是由階段 2 引導(dǎo)加載程序加載到內(nèi)存中的,它會被復(fù)制到 RAM 中并掛載到系統(tǒng)上。這個 initrd 會作為 RAM 中的臨時根文件系統(tǒng)使用,并允許內(nèi)核在沒有掛載任何物理磁盤的情況下完整地實現(xiàn)引導(dǎo)。由于與外圍設(shè)備進(jìn)行交互所需要的模塊可能是 initrd 的一部分,因此內(nèi)核可以非常小,但是仍然需要支持大量可能的硬件配置。在內(nèi)核引導(dǎo)之后,就可以正式裝備根文件系統(tǒng)了(通過 pivot_root):此時會將 initrd 根文件系統(tǒng)卸載掉,并掛載真正的根文件系統(tǒng) 
    initrd.img主要是用于在內(nèi)核啟動時加載內(nèi)核模塊,這需要理解啟動系統(tǒng)的過程。舉個簡單的例子:你的根文件系統(tǒng)是ext3,當(dāng)你編譯內(nèi)核時將ext3文件系統(tǒng)以外掛模塊的方式編譯到內(nèi)核。在啟動Linux系統(tǒng)時,首先會加載內(nèi)核,然后是加載init進(jìn)程。當(dāng)加載init進(jìn)程時,需要讀取ext3文件系統(tǒng)(根文件系統(tǒng)),而此時由于ext3文件系統(tǒng)的支持是以外掛模塊的方式加載的,也必須到根文件系統(tǒng)讀取。問題就來了:此時如何使內(nèi)核加載ext3文件系統(tǒng)的內(nèi)核模塊呢?此我們就可以將ext3的模塊文件放入initrd.img中,由boot loader將該鏡像載入內(nèi)存中。這就是initrd.img的主要作用。
   如果想使用initrd.img,可以將在能夠讀取文件系統(tǒng)之前需要使用到的所用功能都編譯到內(nèi)核當(dāng)中即可。
  
3.兩階段啟動的優(yōu)點(diǎn)
      
       第一階段啟動的目的是為第二階段的啟動掃清一切障礙,最主要的是加載根文件系統(tǒng)存儲介質(zhì)的驅(qū)動模塊。我們知道根文件系統(tǒng)可以存儲在包括IDE、SCSI、USB在內(nèi)的多種介質(zhì)上,如果將這些設(shè)備的驅(qū)動都編譯進(jìn)內(nèi)核,可以想象內(nèi)核會非常的龐大和臃腫。
       當(dāng)內(nèi)核被引導(dǎo)并進(jìn)行初始化之后,內(nèi)核就可以啟動自己的第一個用戶空間應(yīng)用程序了。這是第一個調(diào)用的使用標(biāo)準(zhǔn) C 庫編譯的程序。在此之前,還沒有執(zhí)行任何標(biāo)準(zhǔn)的 C 應(yīng)用程序。在桌面 Linux 系統(tǒng)上,第一個啟動的程序通常是 /sbin/init。

  PS:前段時間第一次給本科生講課,今天在做一個作業(yè)時又用到了些相似的知識,于是把當(dāng)時的PPT大致整理了下,在做PPT時參考了大量網(wǎng)絡(luò)上的資料,現(xiàn)在已經(jīng)無法確定具體的出處。如果文章中有理解錯誤之處,歡迎斧正。