1. Linux 啟動過程              

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

        當找到一個引導設備之后,第一階段的引導加載程序就被裝入 RAM 并執行。這個引導加載程序在大小上小于 512 字節(一個扇區),其作用是加載第二階段的引導加載程序。

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


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

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