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

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > Bootloader/u-boot的啟動(dòng)模式

          Bootloader/u-boot的啟動(dòng)模式

          作者: 時(shí)間:2016-11-24 來(lái)源:網(wǎng)絡(luò) 收藏
          對(duì)于計(jì)算機(jī)系統(tǒng)來(lái)說(shuō),從計(jì)算機(jī)開(kāi)機(jī)上電的到操作系統(tǒng)的啟動(dòng)需要一個(gè)引導(dǎo)過(guò)程。嵌入式Linux同樣也需要一個(gè)引導(dǎo)的過(guò)程,及引導(dǎo)程序就叫做Bootloader。Bootloader是在操作系統(tǒng)啟動(dòng)之前執(zhí)行的一小段程序,通過(guò)這段小程序,我們可以初始化硬件設(shè)備、建立內(nèi)存空間映射表,從而建立適當(dāng)系統(tǒng)軟硬件環(huán)境,為最終調(diào)用操作系統(tǒng)內(nèi)核做好準(zhǔn)備。
          對(duì)于嵌入式系統(tǒng),Bootloader是基于特定平臺(tái)來(lái)實(shí)現(xiàn)的,因此幾乎不可能為所有的計(jì)算機(jī)操作系統(tǒng)建立一個(gè)通用的Bootloader,不同的處理器架構(gòu)都有不同的Bootloader,Bootloader不但依賴(lài)于CPU的體系結(jié)構(gòu),而且依賴(lài)于嵌入式系統(tǒng)板級(jí)的設(shè)備的配置。對(duì)于兩塊不同的嵌入式開(kāi)發(fā)板,即使他們使用同一種處理器,要想讓運(yùn)行于一塊板子上的Bootloader運(yùn)行在另一塊板子上,一般都需要修改Bootloader源程序。
          反過(guò)來(lái)大多數(shù)的Bootloader都具有很多的共性,某些Bootloader也能夠支持多種體系結(jié)構(gòu)的嵌入式系統(tǒng)。例如:u-boot就同時(shí)支持Powerpc、ARm、MIPS和X86等等的體系結(jié)構(gòu),支持的板子有上百種,通常他們都能夠自動(dòng)從存儲(chǔ)介質(zhì)上啟動(dòng),都能夠引導(dǎo)操作系統(tǒng)啟動(dòng),并且大部分都可以支持串口和網(wǎng)口的操作。
          系統(tǒng)加電或者復(fù)位后,cpu通常都會(huì)從某個(gè)地址開(kāi)始執(zhí)行,這是由處理器決定的,對(duì)于ARM處理器而言會(huì)從0x00000000取第一條指令,嵌入式系統(tǒng)的開(kāi)發(fā)板都要把ROM和FLASH映射到這個(gè)地址上,因此必須將Bootloader的程序存儲(chǔ)在相應(yīng)的FLASH位置,這樣系統(tǒng)加電后就會(huì)首先執(zhí)行它。

          u-boot的啟動(dòng)一般流程:
          第一階段:依賴(lài)cpu初始化外圍硬件代碼,通常用匯編代碼實(shí)現(xiàn)
          1、設(shè)置cpu的工作模式;
          2、關(guān)中斷,以防止意外發(fā)生;

          mrs r0,cpsr//讀取cpsr中的數(shù)據(jù)到r0中
          bic r0,r0,#0x 1f//將寄存器r0的值和0x1f的反碼安位與之后將結(jié)果存儲(chǔ)在r0中相當(dāng)于清零
          orr r0,r0,#0xd3//將寄存器r0的值和0xd3 安位或之后將結(jié)果保存在r0寄存器之中,關(guān)閉中斷
          msr cpsr,r0//將cpsr中的數(shù)值寫(xiě)到r0寄存器中
          3、關(guān)閉看門(mén)狗,避免系統(tǒng)重啟;
          #ifdefined(CONFIG_S3C2400)||defined(CONFIG_S3C2410)||defined(CONFIG_S3C2440)

          # if defined(CONFIG_S3C2400)
          # define pWTCON 0x15300000
          # define INTMSK 0x14400008
          # define CLKDIVN 0x14800014
          #else
          # define pWTCON 0x53000000
          # define INTMSK 0x4A000008
          # define INTSUBMSK 0x4A00001C
          # define CLKDIVN 0x4C000014
          # endif
          4、設(shè)置back初始化,設(shè)置cpu的工作頻率;
          #if defined(CONFIG_S3C2440)


          ldr r0, =CLKDIVN
          mov r1,#5
          str r1,[r0]

          mrc p15,0,r1,c1,c0,0
          orr r1, r1,#0xc0000000
          mcr p15,0,r1,c1,c0,0

          mov r1,#CLK_CTL_BASE
          mov r2,#MDIV_405
          add r2,r2,#PSDIV_405
          str r2,[r1,#0x4]
          #else



          ldr r0, =CLKDIVN
          mov r1, #3
          str r1, [r0]
          #endif
          adr r0, _start //adr是讀取地址的偽指令,表示將_start標(biāo)示的運(yùn)行地址給r0
          ldr r1, _TEXT_BASE // 表示將_TEXT_BASE 指向的地址中的數(shù)據(jù)拷貝到r1中
          cmp r0, r1 //比較是否相同
          beq stack_setup //相同跳轉(zhuǎn)出去


          ldr r2, _armboot_start //start起始地址,包含RO代碼段+RW 數(shù)據(jù)段+ZI全局變量
          ldr r3, _bss_start //全局變量的地址

          sub r2, r3, r2 //相減之后得到的是代碼段+數(shù)據(jù)段的總大小
          add r2, r0 r2, //r0是要燒錄的內(nèi)容,表示的是燒錄的代碼段+數(shù)據(jù)段的結(jié)束地址

          copy_loop:
          ldmia r0!, {r3-r10} //ldmia批量的拷貝,向后拷貝32位到r3-r10(將r0中的數(shù)據(jù)讀出到r3-r10的,r0自動(dòng)加一)
          stmia r1!, {r3-r10} //stmia批量的存儲(chǔ)到r1上也就是目標(biāo)運(yùn)行的地址上(將r3-r10中的數(shù)據(jù)保存到r1指向的地址上,r1自動(dòng)加一)
          cmp r0, r2 //r0 燒錄的起始地址,r2燒錄的結(jié)束地址,相等則說(shuō)明拷貝完成
          ble copy_loop
          #endif
          6、設(shè)置建立堆棧;
          7、執(zhí)行內(nèi)存地址上的程序,該工作可以使ldr pc來(lái)完成;

          start.s是u-boot啟動(dòng)所執(zhí)行的第一個(gè)文件,它說(shuō)做的是設(shè)置系統(tǒng)堆棧和cpu的工作方式,為進(jìn)入c程序奠定基礎(chǔ)。
          第二階段:用c語(yǔ)言完成,以實(shí)現(xiàn)更復(fù)雜的命令
          1、 調(diào)用系統(tǒng)一系列的初始化函數(shù);
          2、 初始化Flash設(shè)備;
          3、 初始化系統(tǒng)內(nèi)存分配函數(shù);
          4、 如果目標(biāo)系統(tǒng)有NAND設(shè)備,則初始化NAND設(shè)備;
          5、 如果系統(tǒng)擁有顯示設(shè)備,則初始化該類(lèi)設(shè)備;
          6、 初始化相關(guān)網(wǎng)絡(luò)設(shè)備,填寫(xiě)IP、MAC地址等;
          7、 進(jìn)去命令循環(huán)(即整個(gè)boot的工作循環(huán)),接收用戶(hù)從串口輸入的相關(guān)命令,然后進(jìn)行相應(yīng)的工作;


          評(píng)論


          技術(shù)專(zhuān)區(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); })();