<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > ARM 平臺上的Linux系統啟動(dòng)流程

ARM 平臺上的Linux系統啟動(dòng)流程

作者: 時(shí)間:2016-11-09 來(lái)源:網(wǎng)絡(luò ) 收藏
  開(kāi)始學(xué)習嵌入式開(kāi)發(fā)就一直在使用Linux系統作為學(xué)習的平臺,到現在無(wú)論是PC機還是ARM開(kāi)發(fā)板都已經(jīng)能順利地跑起了Linux系統,但是對Linux 的啟動(dòng)流程還是不甚了解。于是開(kāi)始各種百度谷歌,當然看到了各路大神寫(xiě)的介紹??偟膩?lái)說(shuō)就是:bootloader ->kernel->root filesystem,當然還介紹了哪個(gè)階段完成了哪些工作。比如bootloader 是一上電就拿到cpu 的控制權的,而bootloader實(shí)現了硬件的初始化。bootloader儼然就成了power on 之后”第一個(gè)吃螃蟹”的代碼。

  談到這就得想到硬件機制是如何滿(mǎn)足這個(gè)功能的了。就拿S3C2440 這個(gè)芯片來(lái)說(shuō)(我的硬件平臺就是拿這個(gè)芯片作為主芯片),CPU內部集成了一塊容量為4KB 的 sram (又叫stapping stone 墊腳石),當系統一上電,NAND controler 就自動(dòng)地將nand flash 里的前4K內容到墊腳石里,而PC 指針一上電就指向墊腳石的起始地址0x00。這樣這一部分的代碼就可以得到執行??梢韵胂?,如果這一部分的代碼就是bootloader 的一部分,那一上電bootloader 不就可以得到運行了么?事實(shí)確實(shí)如此,在嵌入式Linux的軟件系統中,nandflash前面一部分代碼往往就是bootloader ,然后就是kernel, 再接著(zhù)就是根文件系統。

本文引用地址:http://dyxdggzs.com/article/201611/317967.htm

  說(shuō)了這么多,好像都沒(méi)說(shuō)到啟動(dòng)流程啊,別著(zhù)急,咱慢慢談,所謂磨刀不誤砍柴工嘛。

  要說(shuō)啟動(dòng)流程,如果只是簡(jiǎn)單的介紹從哪到哪,誰(shuí)干了啥啥,得到的結果可能只是只知其然不知其所以然。個(gè)人覺(jué)得隨著(zhù)CPU的PC指針走,循著(zhù)代碼的足跡才能把整個(gè)流程理清楚,當找到了代碼的執行過(guò)程,再分析一下代碼,自然知道了哪個(gè)部分完成了哪些事,更重要的是為代碼的移植打下了堅實(shí)的基礎。自然這個(gè)過(guò)程是痛苦和枯燥的,甚至是看代碼看了幾天也沒(méi)弄明白,不過(guò)這也是一種鍛煉。好了不扯了,馬上進(jìn)入主題。

bootloder :

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

kernel:

  在討論kernel 是如何啟動(dòng)之前,先了解kernel 的組成結構以及是如何得來(lái)的。

  下面這張圖是內核編譯即將結束時(shí)顯示的信息:

下面的這張圖說(shuō)明了上面的編譯過(guò)程,

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

  可以看到最后得到的可執行文件就是上圖最右邊那個(gè),這也是我們最后燒寫(xiě)到開(kāi)發(fā)板的鏡像。其中piggy.o 就是內核鏡像,而剩下的幾個(gè)文件就組成了引導程序?! ?/p>

  下面開(kāi)始討論CPU的流轉過(guò)程:

  還是用一個(gè)圖來(lái)展示:

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

引導程序: 又叫bootstrap loader ,作為bootloader 和kernel之間的紐帶。head.o從bootloader接過(guò)控制權后bootstrap loader開(kāi)始工作,并完成如下任務(wù):

    1. 使能 I/D caches ,關(guān)閉中斷 , 建立C運行環(huán)境(即設置堆棧)由 head.o 和head-xscal.o 完成   

    2. 解壓縮并重定位代碼 ,由misc.o 完成

    3. 其他硬件相關(guān)的設置,如big.endian.o 為cpu設置大端模式

    4. 將控制權交給內核的 head.o

內核入口點(diǎn):從引導程序接過(guò)控制權,完成如下任務(wù)

    1. 檢查有效的cpu 和cpu的信息

    2. 創(chuàng )建初始化頁(yè)表入口

    3. 使能MMU

    4. 檢測錯誤并報告

    5. 跳轉到內核本身 main.c 文件里的 start_kernel()函數。head-common.S 有一句實(shí)現跳轉語(yǔ)句:b start_kernel

內核啟動(dòng):從kernel 的head.o接過(guò)控制權,開(kāi)始內核的啟動(dòng),在這里完成內核的初始化,如內核各個(gè)子系統的初始化。



關(guān)鍵詞: ARMLinux系統啟動(dòng)流

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>