Linux Kernel系列一:開篇和Kernel啟動概要
阿新 • • 發佈:2017-11-01
mis misc 跳轉 line global 最終 width lin 通過
2 LK執行的第一條語句是什麽?vmlinux是單體的內核表示。根據前面說的內核編譯連接知識,第一條語句是head.S中(歷史原因,MD,有很多文件都叫head.S)
我們需要重新分析一下內核(這裏就是zImage了)的組成,(方法很簡單,研究make的執行過程,通過make V=1 zImage可以得到幾乎全部信息)
圖1 內核的構成 3 piggy的故事 piggy.S很有意思,建立了一個section,並且有一個標誌來指示piggy.gz的邊界。 piggy對應的是一個叫bootstrap的image,註意,Bootstrap和Bootloader不一樣,它是在BL之後的一段代碼,用來 解壓kernel,設置內存等作用。也可以叫second stage boot。
4 Bootloadre和BootstrapLoader
BL和BSL的區別是什麽?
圖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做了什麽事情呢?
前言
最近幾個月將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- 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 內核的構成 3 piggy的故事 piggy.S很有意思,建立了一個section,並且有一個標誌來指示piggy.gz的邊界。 piggy對應的是一個叫bootstrap的image,註意,Bootstrap和Bootloader不一樣,它是在BL之後的一段代碼,用來 解壓kernel,設置內存等作用。也可以叫second stage boot。
- BL只是初始化硬件,不依賴linux,不處理linux
- BSL在BL後執行,依賴linux,因為要解壓linux。另外一個重要點就是BSL需要為LINUX的運行建立環境
- head.O:初始化CPU等工作
- misc.O:解壓,重定位(例如將kernel移動到另外一個位置上) decompress_kernel
- 其他工作
圖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執行
Linux Kernel系列一:開篇和Kernel啟動概要