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

來源:互聯網
上載者:User

前言

最近幾個月將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將核心載入後,控制器移交給LK2 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和BootstrapLoaderBL和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這本書給的參考文獻都巨強.. 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.