ARM Linux從Bootloader、kernel到filesystem啟動流程

教程 15263瀏覽 18評論

ARM Linux啟動流程大致為:bootloader ---->kernel---->root filesystem。bootloader 是一上電就拿到cpu 的控制權的,而bootloader實現了硬件的初始化。bootloader儼然就成了Power on 之后”第一個吃螃蟹”的代碼。

談到這就得想到硬件機制是如何滿足這個功能的了。CPU內部一般都集成小容量的SRAM?(又叫stapping stone,墊腳石),當系統一上電,NAND controler 就自動地將Nand flash 里的前內容復制到墊腳石里,而PC 指針一上電就指向墊腳石的起始地址0x00000000。這樣這一部分的代碼就可以得到執行。所以,這一部分的代碼就是 bootloader 部分,那一上電bootloader 不就可以得到運行了么?事實確實如此,在嵌入式Linux的軟件系統中,nandflash前面一部分代碼往往就是bootloader ,然后就是kernel, 再接著就是根文件系統。

說了這么多,好像都沒說到啟動流程啊,別著急,咱慢慢談,所謂磨刀不誤砍柴工嘛。

要說啟動流程,如果只是簡單的介紹從哪到哪,誰干了啥啥,得到的結果可能只是只知其然不知其所以然。個人覺得隨著CPU的PC指針走,循著代碼的足跡才能把整個流程理清楚,當找到了代碼的執行過程,再分析一下代碼,自然知道了哪個部分完成了哪些事,更重要的是為代碼的移植打下了堅實的基礎。自然這個過程是痛苦和枯燥的,甚至是看代碼看了幾天也沒弄明白,不過這也是一種鍛煉。

bootloder?

前面說了,bootloader一上電就拿到了cpu 的使用權,它當然得干一些初始化的工作啊,比如關閉看門狗、設置cpu 的運行模式、設置堆棧等等比較急迫的事情。當然還要對主板的一些其他硬件進行簡單的初始化,比如外部DDR內存、網卡、顯示屏、nand flash等等的初始化工作,最后還要負責把Linux內核加載到內存中。正所謂責任和權力是并存的嘛,你得到了權益,當然就得付出。當bootloader 完成它的使命之后就會把cpu 的使用權交給下一部分代碼:kernel 。

kernel

在討論kernel 是如何啟動之前,先了解kernel 的組成結構以及是如何得來的。下面這張圖是內核編譯即將結束時顯示的信息:

11f36c7a535f07454fa15220c9e2cf87

 

下面的這張圖說明了上面的編譯過程,

9ae59fb6dc568a9fd3838b9d87f004cc

可以看到,當內核源文件編譯鏈接成 vmlinux 文件以后還進行了幾個模塊的編譯和鏈接。其中(1)vmlinux 是ELF格式的object文件,這種文件只是各個源代碼經過連接以后的得到的文件,并不能在arm平臺上運行。(2)經過objcopy這個工具轉換以后,得到了二進制格式文件Image,Image文件相比于vmlinux 文件,除了格式不同以外,還被去除了許多注釋和調試的信息。(3)Image文件經過壓縮以后得到了piggy.gz ,這個文件僅僅是Image的壓縮版,并無其他不同。(4)接著編譯生成另外幾個模塊文件misc.o、big_endian.o、head.o、head-xscale.o,這幾個文件組成一個叫?bootstrap loader 的組件,又叫引導程序。編譯生成 piggy.o 文件。(5)最后piggy.o文件和bootstrap loader 組成一個bootable kernel Image 文件(可啟動文件)。

可以看到最后得到的可執行文件就是上圖最右邊那個,這也是我們最后燒寫到開發板的鏡像。其中piggy.o 就是內核鏡像,而剩下的幾個文件就組成了引導程序

下面開始討論CPU的流轉過程,還是用一個圖來展示:

294474c84d19f650fe64c3bbbc49ee19

從上圖可以看出,系統一上電就開始執行bootloader。當bootloader 執行完以后,把控制權交給了引導程序的head.o 文件里的start 標號處,當引導程序完成引導工作以后就將控制權轉給真正的內核的head.o 文件里的start 標號處。這里就是內核的入口點,最后內核的head.o將控制交給main.o 的start_kernel 函數。這樣,通過查看相應的代碼就可以知道這些代碼到底完成了哪些工作。在這里我們可以找到相應的代碼,分析一下,看它們到底完成哪些事。下面是我的分析結果:

引導程序:

head.o從bootloader接過控制權,并完成如下任務:

  1. 使能 I/D caches ,關閉中斷 , 建立C運行環境(即設置堆棧)由 head.o 和head-xscal.o 完成
  2. 解壓縮并重定位代碼 ,由misc.o 完成
  3. 其他硬件相關的設置,如big.endian.o 為cpu設置大端模式

內核入口點:從引導程序接過控制權,完成如下任務

  1. 檢查有效的cpu 和cpu的信息
  2. 創建初始化頁表入口
  3. 使能MMU
  4. 檢測錯誤并報告
  5. 跳轉到內核本身 main.c 文件里的 start_kernel()函數

內核啟動:

從 kernel 的head.o接過控制權,開始內核的啟動,在這里完成內核的初始化,如內核各個子系統的初始化。

root filesystem

到此止,kernel完成了系統硬件探測及硬件驅動的初始化,內核空間的相關工作已經完成,開始向用戶空間轉移,內核空間通過一個間接的initrd(一個虛擬的文件系統)向用戶空間過度,然后開始掛載跟文件系統了,其過程:initrd?---->?/sbin/init?---->?/etc/inittab

initrd是一個虛擬的文件系統,里面有lib、bin、sbin、usr、proc、sys、var、dev、boot等一些目錄,其目錄有點像真的/,所以我們稱之為虛擬的根文件系統,作用就是將kernel和真的根文件系統建立關聯關系,讓kernel去initrd中加載根文件系統所需要的驅動程序,并以讀寫的方式掛載根文件系統,并讓執行用戶當中第一個進程init。

init執行完畢以后會啟動系統內的/etc/inittab文件,來完成系統系統的初始化工作。

發表我的評論
取消評論

表情

Hi,您需要填寫昵稱和郵箱!

  • 昵稱 (必填)
  • 郵箱 (必填)
  • 網址

網友最新評論 (18)

  1. 不錯不錯。。。。
    殘雪 5年前 (2015-04-29) 回復 編輯
  2. 不錯。。。。。。。。。。。
    zjf_linux 5年前 (2015-04-29) 回復 編輯
  3. 謝謝分享哦
    杠桿網配資 5年前 (2015-05-21) 回復 編輯
  4. 很專業
    東北黑木耳 5年前 (2015-05-21) 回復 編輯
  5. 支持
    卡絲代理 5年前 (2015-07-13) 回復 編輯
  6. 過來看看
    杭州晨力 5年前 (2015-07-25) 回復 編輯
  7. 好高深的說
    松露巧克力 5年前 (2015-08-01) 回復 編輯
  8. 過來支持一下 感值得收藏分享
    最勵志網 5年前 (2015-08-06) 回復 編輯
  9. 路過看一下!
    歪妖內涵網 4年前 (2015-09-07) 回復 編輯
  10. 來瞅瞅啦~
    愛奇趣分享網 4年前 (2015-09-07) 回復 編輯
  11. 不錯哦,贊一個。求認識,求回訪
    糗事百科 4年前 (2015-10-01) 回復 編輯
  12. 這么多評論啊
    微信紅包 4年前 (2016-01-28) 回復 編輯
  13. 一次自習課上,班長覺得無聊讓大家出對聯,班長出上聯說:天王蓋地虎,小明說:校長250,班長又說:春蠶到死絲方盡,小明又說:校長是個神經病,結果下課后小明就被叫去和校長談話去了
    樂兒 4年前 (2016-01-28) 回復 編輯
  14. 很久沒來了,過來看看
    樂兒 4年前 (2016-01-28) 回復 編輯
  15. 這個網站做得很好啊,學到不少東西,可惜似乎好久不更新了。
    zxj7b80 4年前 (2016-04-18) 回復 編輯
七星彩走势图2元网官网