<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          Bootloader 介紹

          作者: 時(shí)間:2016-11-11 來源:網(wǎng)絡(luò) 收藏
          bootloader的定義:

          相當(dāng)于pc機(jī)的BIOS,在操作系統(tǒng)啟動(dòng)內(nèi)核運(yùn)行之前運(yùn)行的一段小程序,通過這段小程序我們可以初始化cpu內(nèi)部的硬件設(shè)備,建立內(nèi)存空間映射范圍,從而將系統(tǒng)的軟硬件環(huán)境帶到一個(gè)合適的狀態(tài),以便最終調(diào)用os內(nèi)核準(zhǔn)備好正確的環(huán)境。

          本文引用地址:http://www.ex-cimer.com/article/201611/316751.htm

          可以得出bootloader主要有2個(gè)任務(wù),1是初始化cpu內(nèi)部的硬件設(shè)備,2是將os kernel帶到內(nèi)存中去。

          在講bootloader之前,我們先講講pc機(jī)的啟動(dòng)過程,

          pc機(jī)中有bois,這個(gè)是固化在硬件的,當(dāng)pc機(jī)一加電以后,bios就會(huì)自己?jiǎn)?dòng),完成硬件檢測(cè)和資源的分配,然后將硬盤中的引導(dǎo)程序調(diào)入內(nèi)存,然后把控制權(quán)交給引導(dǎo)程序,引導(dǎo)程序主要的用途就是將操作系統(tǒng)的kernel調(diào)入內(nèi)存,然后跳轉(zhuǎn)到內(nèi)核的開始地址,然后os就開始啟動(dòng)了。

          就pc而言,啟動(dòng)的過程相對(duì)復(fù)雜,從bios--->引導(dǎo)程序(grub等)---->os

          但是嵌入式系統(tǒng)來說,他沒有bios這樣硬件,所以它的啟動(dòng)過程全部都是交給bootloader去完成的。

          bootloader是放在flash的最前面的位置,原因是:

          系統(tǒng)在加電或復(fù)位的時(shí)候,所有的cpu通常都從cpu制造商預(yù)先安排地址開始執(zhí)行的,(通常是0x00000000位置),所以bootloader通常是放在flash中的最前面的位置。

          這是一個(gè)簡(jiǎn)易的flash分布圖,bootloader在flash的最前端。

          關(guān)于bootloader的啟動(dòng)過程還可以分為兩種,1是單階段,2是多階段的

          現(xiàn)在很多的bootloader是2個(gè)階段的

          stage 1 的步驟(用的是匯編)

          1是初始化硬件設(shè)備(cpu內(nèi)存的硬件設(shè)備)

          2是初始化stage2 要使用的內(nèi)存空間

          3是把stage 2的代碼copy到內(nèi)存中去

          4初始話堆棧

          5是跳轉(zhuǎn)到c的入口函數(shù)

          stage 2(c語言)

          1.初始化本階段的硬件設(shè)備(板載硬件設(shè)備)

          2.將os kernel導(dǎo)入到內(nèi)存中去

          3.調(diào)用內(nèi)核

          stage 1是用匯編寫,主要是是為了配置能讓c語言運(yùn)行環(huán)境。

          這個(gè)是一個(gè)具體的flash的結(jié)構(gòu)圖,bootloader 在執(zhí)行第一個(gè)部分的時(shí)候,也就是stage1的時(shí)候,會(huì)把bootloader stage2這部分copy到ram中去運(yùn)行,為什么呢,我覺得一個(gè)在內(nèi)存中運(yùn)行總是比在flash中執(zhí)行要好,第二我覺得能執(zhí)行code的flash必須是nor flash,這樣的flash相對(duì)成本也就高了。所以就會(huì)產(chǎn)生這個(gè)部分。當(dāng)stage2的時(shí)候,會(huì)將kernel也copy到內(nèi)存中,然后在結(jié)束的階段,讓執(zhí)行地址跳轉(zhuǎn)到操作系統(tǒng)的入口地址,那樣的話操作系統(tǒng)也就自己?jiǎn)?dòng)來了。

          如果分析過2440的官方代碼的話,里面有一個(gè)start.s 這個(gè)匯編代碼,這可以看成一個(gè)小型的bootloader,因?yàn)樗餐瓿闪俗詥?dòng)的過程,不過他啟動(dòng)的是你的程序而不是操作系統(tǒng),不過作用很相似。

          在上面我們知道bootloader stage1這個(gè)階段的代碼是運(yùn)行在flash中的,如果flash是nor flash的話也是可以的,不過如果你的開發(fā)板是不帶nor flash的話則就不能了。nand flash是不能讓代碼運(yùn)行在flash的,所以他的自啟動(dòng)過程是比較復(fù)雜的。他的cpu有一個(gè)4k ram 在加電的時(shí)候是被當(dāng)作墊腳石使用的,當(dāng)板子加電以后,硬件會(huì)自動(dòng)把flash最前面的code copy到這個(gè)內(nèi)存中的,也就是bootloader stage1這個(gè)部分,在這4kB的空間中的代碼必須要完成講代碼copy的內(nèi)存中去

          對(duì)于bootloader的研究我覺得可以看一下start.s這個(gè)源代碼,你會(huì)知道的更加清楚,不過是匯編的,理解起來會(huì)有點(diǎn)困難,要耐心看的.....

          還有關(guān)于bootloader的移植,為什么要進(jìn)行bootloader的移植呢,原因有2個(gè)

          1是因?yàn)椴煌陌遄又g的cpu體系結(jié)構(gòu)不一樣...

          2是因?yàn)椴煌陌遄又g的外圍硬件設(shè)備不一樣...



          關(guān)鍵詞: Bootloader操作系

          評(píng)論


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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();