2010年12月25日 星期六

kernel的開機執行順序

Linux是一個目前非常普遍的作業系統,因為它為免費且公開原始碼的作業系統,所以在嵌入系統中大家都很喜歡使用它,而且它的執行可以很小,且又有效率。我們現在就來大概地了解一下它的開機順序。
首先我們要了解的是,Linux kernel可以被編譯成兩種形式,一種是有壓縮的,另一種是沒有壓縮的,兩種形式其第一個執行指令不同,我們先來了解有壓縮的,它是將另一種沒有壓縮的kernel將其做壓縮,並在其前面加一段解壓縮的程式碼,而這段程式碼則是可以執行在記憶中任何位置,並且會將kernel作解壓縮之後放在記憶上,之後將其控制權交給kernel,之後的執行順序,有壓縮和没壓縮的順序是一樣的。
那麼我們先來看看有壓縮的第一個指令在那裹,以ARM CPU來說,它是在arch/arm/boot/compressed/head.S的程式裹,這一段是使用組合語言寫的,其中有兩個重要的暫存器,一個是r1存放的是CPU的代碼,這個代碼是由使用自行定義,由bootloader傳過來,這個值定義在arch/arm/tools/mach-types中,在編譯時會產生一個include/asm/mach-types.h,這時會使用CP15來讀回CPU的ID做比對,確認是否正確,並且使用相對應的cache操作副程式,因此在正確的CPU ID比對之後會啓動cache,以加快對kernel的解壓縮動作。
在解壓縮kernel之前,解壓縮程式會先檢查現在的位置是否和解壓縮之後的位址是否有衝突,若沒有則直接開始解壓縮,若有將會解壓縮至其它地方,之後再搬至最後kernel所要擺放的位置,並且跳至kernel的第一個指令,開始執行,而kernel的第一個指令放在arch/arm/kernel/head.S,開始執行時kernel會比對CPU ID是否正確,再初始化系統的cache HAL call back function,以及各種初始化動作,這些定在MACHINE_START的巨集宣告中,而這是使用者所宣告的,這時也會初始化整記憶體管理,最後會呼叫kernel_start,這是在init/main.c之中,接下來會載入各個driver,以及會mount root file system,當一切都好了之後則會呼叫第一支應用程式,default為/sbin/init,你可以在make menuconfig中將其更換你所要執行的程式,而這支程式可以是binary file也可以是shell script,到此就結束所有的開機動作。

2010年12月14日 星期二

如何製作kernel的default setting

當我們取得kernel的source code之後,將其解壓縮,原則上我們第一動作當然會修改根目錄中的Makefile,將其ARCH & CROSS_COMPILE的環境變數修改,例如如下:
ARCH = arm
CROSS_COMPILE = arm-linux-
接著我們將會執行make menuconfig的動作,在結束這個動作之後會產生兩個一個是 .config 它是存在原紿檔的根目錄中,這個檔是給Makefile讀取用的,另一個檔為include/linux/autoconfig.h這是給kernel中的C程式用的,當你完成所有的開發之後,可以將 .config 檔拷貝至 arch/arm/default目錄之下,並且取名為 xxxx_defconfig,其中的 xxxx 為你個人自行取名,如此一來當其它人拿到你的source code之後不知該如何設定時,他可以先執行 make xxxx_defconfig 如此一來將會用你之前的設定設置至 .config & include/linux/autoconfig.h 之中,如此一來這將會是你的default setting。