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

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > ARM體系架構(gòu)下的linux啟動(dòng)之一,從bootloader到linux內(nèi)核

          ARM體系架構(gòu)下的linux啟動(dòng)之一,從bootloader到linux內(nèi)核

          作者: 時(shí)間:2016-11-09 來(lái)源:網(wǎng)絡(luò) 收藏
          1. bootloader的啟動(dòng)


          bootloader本身叫做嵌入式系統(tǒng)的引導(dǎo)程序。但是,它支持X86,MIPS,PowerPC,ARM等多種體系架構(gòu)。

          對(duì)于操作系統(tǒng)的啟動(dòng)來(lái)講,當(dāng)機(jī)器開始上電時(shí),首先加載bootloader,它用來(lái)完成最基本的硬件的初始化,然后加載Linux內(nèi)核。

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

          用于ARM的bootloader一般為U-BOOT,用它來(lái)完成對(duì)linux內(nèi)核的加載設(shè)置,一般bootloader燒寫在開發(fā)板的Flash里,包括Nor Flash或Nand Flash,其中由于NorFlash支持芯片內(nèi)執(zhí)行XIP(eXcute In Place),代碼可以直接在FLASH上執(zhí)行,而NandFlash需要把代碼拷到RAM中再去執(zhí)行。但是RAM的處理速度比Flash的處理速度要快得多,一般仍然把代碼放在RAM中執(zhí)行。

          一般的bootloader需要完成以下五種功能:

          1)RAM的初始化:為調(diào)用linux內(nèi)核做準(zhǔn)備。

          2)串口的初始化:由于一般的嵌入式系統(tǒng)開發(fā)板上沒(méi)有視頻終端,只能用串口進(jìn)行開發(fā),串口的初始化非常重要。

          3)檢測(cè)處理器類型:用來(lái)預(yù)處理加載內(nèi)核的處理器類型的傳遞工作。

          4)設(shè)置Linux的啟動(dòng)參數(shù):包括加載地址,啟動(dòng)方式(從本地分區(qū)或NFS進(jìn)行根文件系統(tǒng)加載),以及Linux根文件系統(tǒng)

          的加載方式。通常用一個(gè)標(biāo)記列表來(lái)記錄linux內(nèi)核啟動(dòng)的各個(gè)參數(shù)。

          5)調(diào)用linux內(nèi)核鏡像:此時(shí)ARM的處理器中的幾個(gè)特殊的寄存器值:r0=0,r1=處理器類型,r2=標(biāo)記列表在RAM中的位置。

          2. linux kernel的啟動(dòng)分析

          首先從http://www.kernel.org 上下載一個(gè)linux內(nèi)核的標(biāo)準(zhǔn)版,然后
          $make menuconfig
          這時(shí)你會(huì)發(fā)現(xiàn),里面配置的體系架構(gòu)為X86的,找不到關(guān)于ARM配置的相關(guān)選項(xiàng),這時(shí)由于當(dāng)前的內(nèi)核體系架構(gòu)與你用于開發(fā)的電腦上的體系架構(gòu)一模一樣。如果要做ARM架構(gòu)下的配置:

          $make menuconfig ARCH=arm
          便可以對(duì)ARM體系下的linux內(nèi)核進(jìn)行配置操作。

          如果需要編譯,還要指定交叉編譯器和體系架構(gòu)類型。


          關(guān)于linux的內(nèi)核一般有兩種映像,一種是非壓縮的映像:Image,另一種是他的壓縮版zImage,在壓縮的鏡像前端還包括了解壓縮的代碼。由于嵌入式系統(tǒng)的存儲(chǔ)空間較小,一般會(huì)采用zImage的內(nèi)核,犧牲速度,但是能得到較小的內(nèi)核。

          Linux內(nèi)核中zImage的入口程序?yàn)閍rch/arm/boot/compressed/head.S

          這個(gè)文件主要完成以下工作:

          1)開啟MMU和Cache

          2)調(diào)用decompress_kernel()解壓內(nèi)核

          3)調(diào)用call_kernel()進(jìn)入非壓縮內(nèi)核Image 的啟動(dòng)

          head.S文件分析:

          在113行以上是關(guān)于debug的相關(guān)代碼和ARM的不同版本的差別。從114行開始,便是函數(shù)的入口:

          114 start:
          115 .type start,#function
          116 .rept 8
          117 mov r0, r0
          118 .endr
          119
          120 b 1f
          121 .word 0x016f2818 @ Magic numbers to help the loader
          122 .word start @ absolute load/run zImage address
          123 .word _edata @ zImage end address
          124 1: mov r7, r1 @ save architecture ID
          125 mov r8, r2 @ save atags pointer

          從這段代碼中可以看出,總共操作的3個(gè)寄存器r0,r1,r2正是bootloader調(diào)用linux內(nèi)核時(shí)需要操作的3個(gè)寄存器。r0寄存器中存放0。然后是r1的CPU類型和r2中的傳入?yún)?shù)列表的指針地址。



          關(guān)鍵詞: ARMbootloaderlinux內(nèi)

          評(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); })();