最近幾個月將linux kernel的大概研究了一下,下面需要進行深入詳細的分析。主要將以s3c2440的一塊開發板為硬體實體。大概包括如下內容:
1 bootloader分析,以uboot為主,結合具體開發板的情況。我的目標是解釋清楚uboot的工作原理(說實話,分析過程中不太想被硬體綁架,但是需要以乙個實際的例子
來做分析)
2 kernel部分,這就很多內容了。打算從kernel啟動的流程開始分析。
3 除kernel本身外,還有很多的知識,例如ld的輸入script分析等,這裡會一起介紹。
kernel啟動流程概要
一:核心image的組成
1 es(embed system)啟動的時候,cpu加電,執行的第一條語句是bootloader,這個非常類似pc機上的bios。bl將核心載入後,控制器移交給lk
2 lk執行的第一條語句是什麼?vmlinux是單體的核心表示。根據前面說的核心編譯連線知識,第一條語句是head.s中(歷史原因,md,有很多檔案都叫head.s)
我們需要重新分析一下核心(這裡就是zimage了)的組成,(方法很簡單,研究make的執行過程,通過make v=1 zimage可以得到幾乎全部資訊)
圖1很好得展示了這個過程。
圖1 核心的構成
3 piggy的故事
piggy.s很有意思,建立了乙個section,並且有乙個標誌來指示piggy.gz的邊界。
piggy對應的是乙個叫bootstrap的image,注意,bootstrap和bootloader不一樣,它是在bl之後的一段**,用來
解壓kernel,設定記憶體等作用。也可以叫second stage boot。
4 bootloadre和bootstraploader
bl和bsl的區別是什麼?
bsl的工作包括:
init/main.c:start_kernel
啟動呼叫圖見圖2.
圖2 啟動呼叫流程圖
下面來分析這個啟動流程
1 kernel中的head.o分析:盡量保持cpu系列的通用,例如arm的cpu等初始化都在做。但是具體板子(例如cpu+其他硬體)怎麼初始化?這就是由mach目錄中的初始化函式做到的。所以,kernel初始化分為:generic cpu初始化+具體板子的初始化。head.o初始化後,跳轉到main.o的start_kernel,繼續後面的流程
2 start_kernel:(init/main.c):start_kernel的轉移由head.o做的,不過**一般包含在更通用的head_common.s中
以後想做kernel的分析,就從main開始吧. start_kernel做了什麼事情呢?
3 kernel 引數分析:kernel command line。注意,這個引數是由bl傳遞給kernel的,不過這個引數又是誰設定的呢?又存在什麼地方呢?這個line放在乙個global的地方,
另外,kernel如何處理這些引數呢?有乙個比較好的辦法,__set_up巨集,將一些引數和對應的函式指標存在乙個特殊的section中,然後迴圈呼叫這個section中的函式。(和驅動module中的很像)。定義在init.h中。關於一些特殊引數的取值,在arch/arm/kernel/vmlinux.lds.s中定義。(以後得去看看ld的manual了)__set_up這個巨集還有乙個flags比如early,表示處理階段是否在early-stage做。標誌有__init的section最終占用的記憶體會被拋棄..
4 子系統初始化:包括中斷、等。?section巢狀section?
5 kernel_init程序:start_kernel最後會fork乙個kernel_init程序,而原執行程序變成idle程序了..
6 使用者空間的init程序:由kernel_init程序最終通過execve init完成
7 參考文獻。elp這本書給的參考文獻都巨強..
Kernel啟動概要
1 bootloader分析,以uboot為主,結合具體開發板的情況。我的目標是解釋清楚uboot的工作原理 說實話,分析過程中不太想被硬體綁架,但是需要以乙個實際的例子 來做分析 2 kernel部分,這就很多內容了。打算從kernel啟動的流程開始分析。3 除kernel本身外,還有很多的知識,...
如何記錄kernel啟動時間
sdkstarttimer timer cudaeventrecord start,0 cudamemcpyasync d a,a,nbytes,cudamemcpyhosttodevice,0 increment kernel d a,value cudamemcpyasync a,d a,nby...
Android 啟動效能優化 kernel篇
題目有點大,其實kernel的啟動效能調整和android基本沒什麼關係,我想應該適用所有使用linux的嵌入式裝置 時間測量 說到效能調整,第一件該幹的的事就是看下時間到底消耗在 俗話說的好 知己知彼,百戰百勝 過度優化,萬惡之首 因此手頭上要有稱心如意的時間測試工具,方法。其實我是不太喜歡工具的...