亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        Cortex-A8的Bootloader設(shè)計與實(shí)現(xiàn)※

        2015-07-03 03:33:42葉茂李智任和
        關(guān)鍵詞:源文件源碼環(huán)境變量

        葉茂,李智,任和

        (四川大學(xué) 電子信息學(xué)院,成都610064)

        引 言

        隨著電子行業(yè)日新月異的發(fā)展,ARM處理器憑借自身高性能、低成本、低功耗等特點(diǎn),廣泛應(yīng)用于消費(fèi)電子、數(shù)字家電、工業(yè)生產(chǎn)等領(lǐng)域中[1]。Cortex-A8為Cortex系列中的“A”系列,采用ARM v7架構(gòu),主要面向搭載操作系統(tǒng)、高性能的應(yīng)用領(lǐng)域。Bootloader是系統(tǒng)上電后執(zhí)行的第一段代碼,其功能類似于電腦的BIOS[2]。簡單來說,Bootloader的工作主要有兩點(diǎn):其一是初始化底層硬件資源,為操作系統(tǒng)啟動提供必要的環(huán)境;其二是從存儲設(shè)備中讀取操作系統(tǒng)鏡像并啟動[3-4]。但為了方便后期開發(fā),往往要為Bootloader添加其他的功能,如支持串口打印調(diào)試信息、NFS網(wǎng)絡(luò)下載、根文件系統(tǒng)燒寫等[5]。本文以u-boot-2013.01為源碼包,設(shè)計了一個基于S5PV210平臺,功能齊全且高效穩(wěn)定的Bootloader。

        1 硬件平臺

        1.1 S5PV210簡介

        S5PV210是三星公司推出的一款基于Cortex-A8架構(gòu)的高性能應(yīng)用處理器。該處理器支持ARM v7指令集,具有32位內(nèi)部總線結(jié)構(gòu),主頻最高可達(dá)1 GHz,另外還支持掛接LPDDR1、LPDDR2和DDR2類型的RAM,F(xiàn)lash方面可選擇NAND Flash或NOR Flash等。不僅如此,該處理器還提供了包括串口、LCD、I2C、SPI、USB、HDMI等豐富的外部接口資源。目前S5PV210已經(jīng)廣泛應(yīng)用于智能手機(jī)和平板電腦之中。

        1.2 S5PV210的啟動方式

        S5PV210支持多種啟動方式,啟動流程如圖1所示。

        圖1 S5PV210的啟動流程

        S5PV210的啟動過程由BL0、BL1和BL2(BL為Bootloader的簡稱)3部分代碼實(shí)現(xiàn),其中BL0在出廠時已經(jīng)被固化到64 KB的iROM中。S5PV210上電后首先執(zhí)行BL0,該段代碼主要負(fù)責(zé)一些簡單的初始化工作,如關(guān)看門狗、初始化ICache等;然后BL0會根據(jù)硬件設(shè)置判斷使用何種方式啟動,并將BL1從啟動設(shè)備(OneNand、Nand Flash、USB、UART、SD card等)拷貝到Internal SRAM的BL1區(qū)中;最后BL0會比較一個校驗(yàn)值,如果相等則跳轉(zhuǎn)到BL1中繼續(xù)執(zhí)行,否則轉(zhuǎn)入其他啟動方式。該校驗(yàn)值存在于BL1的頭部,大小為16字節(jié)。

        開發(fā)人員一般會單獨(dú)編寫一個工具為BL1編譯出的二進(jìn)制文件添加頭部。其校驗(yàn)值(checksum)的計算方法如下:

        由于BL1的大小被限制為16 KB,所以一般情況下BL1負(fù)責(zé)的工作也不多。BL1被執(zhí)行后首先初始化系統(tǒng)時鐘、內(nèi)存、串口等,然后將BL2代碼拷貝到Internal SRAM的BL2區(qū)中并跳轉(zhuǎn)執(zhí)行。實(shí)際上SRAM的BL2區(qū)的大小只有80 KB,但很多情況下BL2代碼的大小遠(yuǎn)遠(yuǎn)超過80 KB,所以將BL2代碼拷貝到SRAM中意義不大。更好的做法是直接將BL2拷貝到容量更大的內(nèi)存中,不過在拷貝之前一定要先初始化好系統(tǒng)時鐘和內(nèi)存。BL2是整個Bootloader的主體部分,因此它需要完成更多的初始化工作,例如初始化網(wǎng)卡、Flash等,之后BL2讀取操作系統(tǒng)鏡像到內(nèi)存中運(yùn)行。一般把操作系統(tǒng)鏡像放到Flash上,也可以放到SD卡上,根據(jù)具體的開發(fā)平臺而定。

        2 軟件平臺

        2.1 U-Boot介紹

        U-Boot(全稱 Universal Bootloader)是Bootloader的一種,其他常見的Bootloader還有RedBoot、vivi等。與它們相比,U-Boot具有代碼開源、可靠性和擴(kuò)展性較高等優(yōu)點(diǎn)。另外,對于類似于Nand Flash、Nor Flash、網(wǎng)卡、LCD等硬件資源,U-Boot已經(jīng)抽象出與硬件平臺無關(guān)的代碼作為設(shè)備驅(qū)動源碼提供給開發(fā)者。對于與硬件平臺相關(guān)的代碼,U-Boot將其定義成宏并保留在配置文件中,開發(fā)者往往只需要修改這些宏的值就能成功使用這些硬件資源,讓移植工作變得十分簡單。

        2.2 U-Boot中幾個比較重要的源文件

        U-Boot的源碼包含有上千個源文件,但經(jīng)過分析之后,可以找出如下幾個比較重要的源文件(括號中為該源文件所在源碼包的位置):

        (1)start.S(arch\arm\cpu\armv7\start.S)

        通過分析U-Boot的鏈接文件可以發(fā)現(xiàn),start.S是UBoot上電后執(zhí)行的第一個源文件。該源文件包括定義了異常向量入口、相關(guān)的全局變量、禁用L2緩存、關(guān)閉MMU等,之后跳轉(zhuǎn)到lowlevel_init()函數(shù)中繼續(xù)執(zhí)行。

        (2)lowlevel_init.S(board\samsung\smdkv210\lowlevel_init.S)

        該源文件用匯編代碼編寫,其中只定義了一個函數(shù)lowlevel_init()。該函數(shù)實(shí)現(xiàn)對平臺硬件資源的一系列初始化過程,包括關(guān)看門狗、初始化系統(tǒng)時鐘、內(nèi)存和串口。

        (3)mem_setup.S(board\samsung\smdkv210)

        該源文件包含對內(nèi)存進(jìn)行初始化的匯編源碼。

        (4)board.c(arch\arm\lib\board.c)

        該源文件是用C語言編寫的,主要實(shí)現(xiàn)了U-Boot第二階段啟動過程,包括初始化環(huán)境變量、串口控制臺、Flash和打印調(diào)試信息等,最后調(diào)用main_loop()函數(shù)。

        (5)smdkv210.h(include\configs\Smdkv210.h)

        S5PV210平臺的配置文件,該源文件定義了一些與CPU或者外設(shè)相關(guān)的參數(shù),這些參數(shù)都是用宏來定義的。

        2.3 U-Boot啟動的一般流程

        2.3.1 第一階段初始化

        U-Boot的啟動過程分為兩個階段:第一階段主要由匯編代碼實(shí)現(xiàn),負(fù)責(zé)對CPU及底層硬件資源的初始化;第二階段用C語言實(shí)現(xiàn),負(fù)責(zé)使能Flash、網(wǎng)卡和引導(dǎo)操作系統(tǒng)等。第一階段啟動流程如圖2所示。

        圖2 U-Boot第一階段啟動流程

        上電后,U-Boot首先會設(shè)置CPU為管理模式、禁用L1緩存、關(guān)閉MMU和清除Caches,之后調(diào)用底層初始化函數(shù)lowlevel_init()。該函數(shù)實(shí)現(xiàn)略——編者注。

        初始化完成之后,U-Boot首先調(diào)用一個拷貝函數(shù)將BL2拷貝到內(nèi)存地址為0x 3FF0 0000處,然后跳轉(zhuǎn)到該位置執(zhí)行BL2。在U-Boot中,BL1和BL2是基于相同的一些源文件編譯生成的。開發(fā)者在編寫代碼時需要使用預(yù)編譯宏CONFIG_SPL_BUILD來實(shí)現(xiàn)BL1和BL2不同的功能。其拷貝函數(shù)實(shí)現(xiàn)略——編者注。

        2.3.2 第二階段初始化

        進(jìn)入第二階段后,U-Boot首先聲明一個gd_t結(jié)構(gòu)體類型的指針指向內(nèi)存地址(0x 4000 0000~GD_SIZE)處。0x 4000 0000為內(nèi)存結(jié)束地址,GD_SIZE為結(jié)構(gòu)體gd_t的大小,這樣相當(dāng)于在內(nèi)存最頂端分配了一段空間用于存放一個臨時結(jié)構(gòu)體gd_t。該結(jié)構(gòu)體在global_data.h中被定義,U-Boot用它來存儲所有的全局變量。之后U-Boot會調(diào)用board_init_f()和board_init_r()兩個函數(shù)進(jìn)一步對底板進(jìn)行初始化。

        (1)board_init_f()

        進(jìn)入board_init_f()之后,U-Boot首先設(shè)置之前分配的臨時結(jié)構(gòu)體,然后開始劃分內(nèi)存空間,其內(nèi)存分配狀態(tài)如圖3所示。

        圖3 U-Boot內(nèi)存分配狀態(tài)

        從圖3中可以看到,gd指針指向的臨時結(jié)構(gòu)體存放在內(nèi)存的最頂部。BL2代碼存放在內(nèi)存地址0x 3ff0 0000處,即距離內(nèi)存頂部1 MB空間的位置,接下來依次分配malloc空間、bd_t結(jié)構(gòu)體空間和gd_t結(jié)構(gòu)體空間,并且重新設(shè)置棧,最后將臨時結(jié)構(gòu)體拷貝到ID指針?biāo)赶虻奈恢?。board_init_f()實(shí)現(xiàn)過程略——編者注。

        (2)board_init_r()

        board_init_r()負(fù)責(zé)對其他硬件資源進(jìn)行初始化,如網(wǎng)卡、Flash、MMC、中斷等,最后調(diào)用 main_loop(),等待用戶輸入命令。

        3 設(shè)計實(shí)現(xiàn)

        3.1 支持Nand Flash讀寫

        Nand Flash是嵌入式系統(tǒng)中重要的存儲設(shè)備,存儲對象包括Bootloader、操作系統(tǒng)內(nèi)核、環(huán)境變量、根文件系統(tǒng)等,所以使能Nand Flash讀寫是U-Boot移植過程中必須完成的一個步驟。U-Boot中Nand Flash初始化函數(shù)調(diào)用關(guān)系為:board_init_r()->nand_init()->nand_init_chip()->board_nand_init()。

        board_nand_init()完成兩件事:①對S5PV210關(guān)于Nand Flash控制器的相關(guān)寄存器進(jìn)行設(shè)置。②對nand_chip結(jié)構(gòu)體進(jìn)行設(shè)置。需要設(shè)置的成員項(xiàng)有IO_ADDR_R和IO_ADDR_W,這兩個成員都指向地址0x B0E0 0010,即Nand Flash控制器的數(shù)據(jù)寄存器的地址。此外還需要實(shí)現(xiàn)以下3個成員函數(shù):

        ①void(*select_chip)(struct mtd_info*mtd,int chip);

        該函數(shù)實(shí)現(xiàn)Nand Flash設(shè)備選中或取消選中。

        ②void(*cmd_ctrl)(struct mtd_info *mtd,int dat,unsigned int ctrl);

        該函數(shù)實(shí)現(xiàn)對Nand Flash發(fā)送命令或者地址。

        ③int(*dev_ready)(struct mtd_info*mtd);

        該函數(shù)實(shí)現(xiàn)檢測Nand Flash設(shè)備狀態(tài)。最后將成員ecc.mode設(shè)置為NAND_ECC_SOFT,即ECC軟件校驗(yàn)。

        配置文件中相應(yīng)的宏定義略——編者注。

        3.2 支持網(wǎng)卡

        支持NFS或TFTP網(wǎng)絡(luò)下載會極大地方便從Linux服務(wù)器上下載文件或鏡像到硬件平臺上,所以使能網(wǎng)卡在U-Boot移植過程中就顯得非常重要。以網(wǎng)卡DM9000為例,U-Boot已經(jīng)抽象出一套完整的關(guān)于DM9000的驅(qū)動代碼(其源碼路徑為drivers\net\dm9000x.c),用戶只需要根據(jù)具體的硬件電路配置相應(yīng)的宏即可。U-Boot中DM9000網(wǎng)卡初始化函數(shù)的調(diào)用關(guān)系為:board_init_r()->eth_initialize()->board_eth_init()->dm9000_initialize()。

        配置文件中相應(yīng)的宏定義略——編者注。

        3.3 支持環(huán)境變量的保存和修改

        為了方便用戶配置,U-Boot將一部分變量,如串口波特率、IP地址、內(nèi)核參數(shù)、啟動命令等存在Flash或SD卡上,這部分?jǐn)?shù)據(jù)稱為環(huán)境變量。每次上電啟動時,U-Boot會檢查Flash或SD卡上是否存放有環(huán)境變量。如果有則將其讀取出來并使用,如果沒有就使用默認(rèn)的環(huán)境變量。默認(rèn)的環(huán)境變量定義在env_default.h中,用戶也可以隨時修改或保存環(huán)境變量到Flash或SD卡中。

        環(huán)境變量的移植非常簡單。以Nand Flash為例,開發(fā)人員在smdkv210.h源文件中只需要添加如下的宏定義:

        4 測試結(jié)果

        4.1 測試U-Boot啟動

        測試平臺的軟硬件環(huán)境:硬件平臺為友善之臂的smart210開發(fā)板;Linux服務(wù)器版本為ubuntu9.0;U-Boot版本為2013-01;GCC交叉編譯工具鏈版本為4.3.2。

        首先將修改后的源碼包放到裝有交叉編譯工具鏈的Linux服務(wù)器上,輸入命令make即可以編譯生成兩個二進(jìn)制文件。一個是smdkv210-spl.bin,即BL1代碼,存放在spl目錄下;另一個是u-boot.bin,即BL2代碼,存放在頂層目錄下。然后插入SD卡,執(zhí)行write2sd.sh腳本就可以把BL1和BL2分別燒寫到SD卡的第1扇區(qū)和第49扇區(qū)。write2sd.sh腳本實(shí)現(xiàn)如下:

        燒寫完成之后將SD卡插入到smart210開發(fā)板的SD卡槽中,連接好串口和網(wǎng)線,上電啟動。通過串口工具(本次測試使用的是SecureCRT)看到輸出信息,即表示該UBoot已經(jīng)成功運(yùn)行在開發(fā)板上,測試U-Boot啟動圖略——編者注。

        4.2 測試Nand Flash和網(wǎng)卡

        在等待命令狀態(tài)下輸入“nfs 20000000 192.168.1.123:/work/nfs_root/uImage”,該命令表示從IP為192.168.1.123的Linux服務(wù)器上,通過NFS下載該服務(wù)器上“/work/nfs_root”目錄下的uImage,并存放在內(nèi)存地址為0x 2000 0000處,uImage為適配于S5PV210開發(fā)板的Linux內(nèi)核鏡像。等待一段時間后看到“Bytes transferred=2127008(2074a0 hex)”字樣,表示下載成功。

        下載成功之后輸入命令“nand erase.part kernel”,該命令表示擦除Nand Flash上的kernel分區(qū)。接著輸入命令“nand write 2000 0000 kernel”,該命令表示拷貝內(nèi)存地址為0x 2000 0000的內(nèi)容,燒寫到Nand Flash的kernel分區(qū)中。內(nèi)存地址0x 2000 0000存放的內(nèi)容正是之前從Linux服務(wù)器上下載下來的uImage。kernel保存在環(huán)境變量mtdparts中,kernel規(guī)定了該分區(qū)的起始地址和大小。執(zhí)行完這兩條命令后看到“4194304 bytes written:OK”字樣,表示系統(tǒng)內(nèi)核已經(jīng)成功燒寫到Nand Flash中,證明了Nand Flash和網(wǎng)卡均可以正常使用。其實(shí)驗(yàn)結(jié)果略——編者注。

        4.3 測試引導(dǎo)內(nèi)核啟動

        燒寫完內(nèi)核之后執(zhí)行boot命令就可以啟動該內(nèi)核。boot命令實(shí)際上是執(zhí)行環(huán)境變量bootcmd中的一條語句,其內(nèi)容為“nand read 2000 0000 kernel;bootm 20000000”,該語句表示從Nand Flash的kernel分區(qū)中讀出內(nèi)核并存放在內(nèi)存地址為0x 2000 0000處,然后跳轉(zhuǎn)在該地址執(zhí)行內(nèi)核鏡像。啟動過程中可以看到串口打印出的信息,證明了該U-Boot已經(jīng)成功支持引導(dǎo)Linux操作系統(tǒng)。測試引導(dǎo)內(nèi)核啟動圖略——編者注。

        結(jié) 語

        本文首先從硬件和軟件兩個方面分析了S5PV210的特性及啟動方式,然后通過u-boot-2013.01源碼包詳細(xì)闡述了U-Boot啟動過程中的兩個階段,最后結(jié)合smart210開發(fā)板成功設(shè)計了一個基于SD卡啟動、多功能的Bootloader。測試結(jié)果表明,該Bootloader支持Nand Flash讀寫、NFS網(wǎng)絡(luò)下載、環(huán)境變量保存和修改等功能,為后期開發(fā)帶來了極大的便利。

        編者注:本文為期刊縮略版,全文見本刊網(wǎng)站www.mesnet.com.cn。

        [1]馮林琳,耿恒山.基于S3C6410的Uboot分析與移植[J].計算機(jī)與現(xiàn)代化,2013(1):119-121.

        [2]王茜.基于ARM的平板電腦硬件平臺設(shè)計[J].微型機(jī)與應(yīng)用,2012(22):29-31.

        [3]梁超,楊峰,雷鵬,等.U-Boot SD卡啟動方式的移植分析與功能擴(kuò)展[J].現(xiàn)代電子技術(shù),2013(20):84-86,90.

        [4]張健,周書林,朱文靜.基于硬件抽象層的Bootloader研究與實(shí)現(xiàn)[J].現(xiàn)代電子技術(shù),2010(8):38-40.

        [5]郭鋒,袁國良,王麗芳.嵌入式Linux引導(dǎo)加載程序分析與設(shè)計[J].信息技術(shù),2011(11):123-125.

        猜你喜歡
        源文件源碼環(huán)境變量
        基于最大熵模型的云南思茅松潛在分布區(qū)
        基于網(wǎng)頁源碼結(jié)構(gòu)理解的自適應(yīng)爬蟲代碼生成方法
        基于圖神經(jīng)網(wǎng)絡(luò)的軟件源碼漏洞檢測方法
        企業(yè)如何保護(hù)源碼
        從桌面右鍵菜單調(diào)用環(huán)境變量選項(xiàng)
        徹底弄懂Windows 10環(huán)境變量
        網(wǎng)絡(luò)社區(qū)劃分在軟件質(zhì)量問題分析中的應(yīng)用
        基于源文件可疑度的軟件缺陷定位方法研究
        LKJ基礎(chǔ)數(shù)據(jù)源文件自動編制系統(tǒng)的研究
        基于數(shù)據(jù)結(jié)構(gòu)教輔系統(tǒng)的實(shí)驗(yàn)課程改革
        91九色极品探花内射| 无码人妻丰满熟妇区五十路百度| 最近中文字幕完整版| 亚洲av成人一区二区三区网址| 中文字幕在线人妻视频| 最近中文字幕精品在线| 亚洲中国精品精华液| 在线视频观看免费视频18| 精品丝袜人妻久久久久久| 中文字幕乱码中文乱码毛片| 久久精品国产亚洲av四区| 男吃奶玩乳尖高潮视频| 777亚洲精品乱码久久久久久 | 国产青青草视频在线播放| 亚洲一区二区三区在线视频| 色窝窝无码一区二区三区| 亚洲色欲色欲www| 亚洲欧美一区二区三区国产精| 99久久国产一区二区三区| 久久精品熟女亚洲av麻豆永永| 中文精品久久久久人妻不卡| 国产精品久久毛片av大全日韩| 国产国拍亚洲精品福利| 国产在线视频一区二区三区| 97精品人妻一区二区三区蜜桃 | 日韩一区二区三区久久精品| 97色偷偷色噜噜狠狠爱网站| 国产乱妇乱子视频在播放 | 在线观看国产内射视频| 国产成人av一区二区三| 大桥未久av一区二区三区| av无码精品一区二区三区宅噜噜| AV永久天堂网| 亚洲精品99久91在线| 色综合久久中文综合网亚洲| 成l人在线观看线路1| 国产精品18久久久久网站| 亚洲无人区乱码中文字幕| 青青草国产在线视频自拍| 亚洲av福利无码无一区二区| 亚洲都市校园激情另类|