在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > ARM 平臺(tái)上的Linux系統(tǒng)啟動(dòng)流程

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

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

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

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

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

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

            bootloder :

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

            kernel:

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

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

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

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

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

              下面開始討論CPU的流轉(zhuǎn)過程:

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

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

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

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

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

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

                4. 將控制權(quán)交給內(nèi)核的 head.o

            內(nèi)核入口點(diǎn):從引導(dǎo)程序接過控制權(quán),完成如下任務(wù)

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

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

                3. 使能MMU

                4. 檢測(cè)錯(cuò)誤并報(bào)告

                5. 跳轉(zhuǎn)到內(nèi)核本身 main.c 文件里的 start_kernel()函數(shù)。head-common.S 有一句實(shí)現(xiàn)跳轉(zhuǎn)語句:b start_kernel

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



            評(píng)論


            技術(shù)專區(qū)

            關(guān)閉