Linux Kernel系列一:開篇和Kernel啓動概要

前言linux

最近幾個月將Linux Kernel的大概研究了一下,下面須要進行深刻詳細的分析。主要將以S3C2440的一塊開發板爲硬件實體。大概包括以下內容:bootstrap

1 bootloader分析,以uboot爲主,結合具體開發板的狀況。個人目標是解釋清楚uboot的工做原理(說實話,分析過程當中不太想被硬件綁架,可是須要以一個實際的例子函數

來作分析)spa

2 kernel部分,這就不少內容了。打算從kernel啓動的流程開始分析。指針

3 除kernel自己外,還有不少的知識,例如ld的輸入script分析等,這裏會一塊兒介紹。進程


kernel啓動流程概要ip

一:內核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能夠獲得幾乎所有信息)
  • vmlinux,這個是未壓縮、未strip的內核模塊,ELF結構
  • Image:二進制、未壓縮、可是strip後的內核
  • head.o:ARM相關的,由BL將控制權轉交給它。即前面提到的head.S生成
  • pigg.gz:Image文件的gzip壓縮
  • piggy.o:由piggy.S生成,這個S文件經過include Bin方式將Image包含進來。piggy的意思就是揹負、肩扛。很形象不是?
  • misc.o:從上面看,涉及到一些解壓方面的內容,而misc提供一些輔助函數
  • vmlinux:悲催.....這個文件是head+pigg+misc構成的vmlinux。名字同樣不是?真的很混淆!
  • zImage:再由上面這個vmlinux壓縮而來
圖1很好得展現了這個過程。

圖1 內核的構成
3 piggy的故事
piggy.S頗有意思,創建了一個section,而且有一個標誌來指示piggy.gz的邊界。
piggy對應的是一個叫bootstrap的image,注意,Bootstrap和Bootloader不同,它是在BL以後的一段代碼,用來
解壓kernel,設置內存等做用。也能夠叫second stage boot。
 
4 Bootloadre和BootstrapLoader
BL和BSL的區別是什麼?
  • BL只是初始化硬件,不依賴linux,不處理linux
  • BSL在BL後執行,依賴linux,由於要解壓linux。另一個重要點就是BSL須要爲LINUX的運行創建環境
BSL的工做包括:
  • head.O:初始化CPU等工做
  • misc.O:解壓,重定位(例如將kernel移動到另一個位置上) decompress_kernel
  • 其餘工做
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作了什麼事情呢?
  • 剛纔只是初始化了cpu相關的,而具體和板子相關的由start_arch執行
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這本書給的參考文獻都巨強..
相關文章
相關標籤/搜索