1. Linux 啟動(dòng)過程              

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

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

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


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

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