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,到此就結束所有的開機動作。

沒有留言:

張貼留言