1. 程式人生 > >簡單理解嵌入式linux啟動過程

簡單理解嵌入式linux啟動過程

  1. BootLoader。BootLoader有多種工具,常見的如u-boot,Blob等等,其基本的作用就是載入(load)核心映象,裝置樹,ramdisk(注意ram,即會載入到記憶體中),將這些東西載入到記憶體的指定地址處(如通過mkimage生成的映象,在u-boot裡使用bootm指令來載入)。Bootloader是一個裸機程式。U-Boot是arm平臺上標準的BootLoader。
    U-Boot的配置是以巨集的形式定義在C的.h 檔案中的,以巨集的形式定義了要執行的Shell指令碼。定義了很多種啟動方式,如sdbootusbbootnandboot等等。不同的啟動方式用了不同的指令從不同的地方載入,比如sdboot中就是 load mmc ...

    ,usbboot就是 load usb ...,nandboot是nand read ...

  2. 啟動核心。BootLoader之後開始啟動核心,這個過程有Kernel command line,即核心啟動時的一些引數,如初始化串列埠等。BootLoader可以設定bootargs,bootargs在BootLoader階段是不起作用的,是傳給核心的,預設會覆蓋掉核心中本來的Kernel command line,但是也可以在核心中設定讓核心不使用BootLoader傳過來的Bootargs,或者將其附加到原本的command line後面(可以通過make menuconfig 中的Boot options->Kernel command line type設定)。

  3. 在核心啟動過程,會去載入根檔案系統,通過Kernel command line中的 root=..,如root來載入指定位置的根檔案系統。首先知道什麼是檔案系統,“檔案系統是對一個儲存裝置上的資料和元資料進行組織的機制”,比如在ubuntu上插一個U盤,掛載到linux的一個資料夾中,這個U盤中的資料和ubuntu本來的資料就是兩個檔案系統,可以用df檢視一下。
    之前我一直以為ramdisk就是根檔案系統,其實不是。根檔案系統其實就是一些系統資料夾,比如我們在ubuntu下用cd / 就看到系統根目錄,有etc,bin等資料夾,其中儲存了ubuntu的環境變數等系統配置。嵌入式的根檔案系統裡邊就是etc,bin這些東西。


    根問件系統一般有三種類型,基於儲存器,基於記憶體(ram),基於網路。

    • ramdisk是一種基於記憶體的檔案系統(注意名字中有個ram),是使用BootLoader對應的工具製作的,會在BootLoader階段load,載入到記憶體中(在U-Boot就是使用bootm這個指令來載入到記憶體中),ramdisk佔用記憶體空間,不佔用sd卡或硬碟空間。BootLoader將ramdisk映象載入到記憶體中後,核心如果要用它作為根檔案系統就在kernel command line 裡設定root=/dev/ram。但是ramdisk的缺點很明顯,因為是基於記憶體的根檔案系統,所以直接對其進行的修改在掉電後是不會儲存的,只能通過重新制作在進行修改,而且其佔用記憶體空間,但記憶體空間往往很小。
    • 使用基於儲存器的根檔案系統時,即root=/dev/mmc..,一般都要給 kernel command line 加上 rootwait這個選項,來避免載入根檔案系統時,讀寫sd卡的驅動還沒初始化完成。同時注意檢查啟動log的kernel command line 是否被BootLoader中的bootargs覆蓋。

總結:

在移植linux時,多注意看啟動時的log,如果是核心啟動之前(如log沒有列印到starting kernel)的問題,那麼就去看Bootloader的配置是否正確,如果是之後,那就去看核心的配置是否有問題,如kernel command line 是否被BootLoader中的bootargs覆蓋。

以上為最近在zedboard上弄xilinx linux的一些個人總結,之後再修改和補充。