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

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 引導(dǎo)加載程序vivi 的分析和移植研究

          引導(dǎo)加載程序vivi 的分析和移植研究

          ——
          作者:陜西科技大學(xué) 陳艷 時(shí)間:2006-12-27 來(lái)源:電子設(shè)計(jì)應(yīng)用 收藏

          摘  要軟件開(kāi)發(fā)的第一個(gè)環(huán)節(jié),它將軟硬件緊密地銜接在一起,對(duì)于一個(gè)嵌入式設(shè)備后續(xù)的軟件開(kāi)發(fā)至關(guān)重要。本文以處理器和嵌入式Linux為基礎(chǔ),對(duì)中的一款進(jìn)行分析和研究。在對(duì)的分析過(guò)程中,探討了處理器上的移植。

          關(guān)鍵詞;

          引言

          Bootloader(引導(dǎo)裝載器)是用于初始化目標(biāo)板硬件,給嵌入式操作系統(tǒng)提供板上硬件資源信息,并進(jìn)一步裝載、引導(dǎo)嵌入式操作系統(tǒng)運(yùn)行的固件。在開(kāi)發(fā)過(guò)程中, Bootloader的編寫往往是設(shè)計(jì)的主要難點(diǎn)。目前,Bootloader的開(kāi)發(fā)通常都是基于一些開(kāi)源的Bootloader(如vivi、U-Boot、Blob、ARMBoot、RedBoot等)而設(shè)計(jì),它們?cè)谠O(shè)計(jì)思路上有許多相通之處。

          vivi是當(dāng)前比較流行的,專門針對(duì)ARM9處理器而設(shè)計(jì)的一款Bootloader,它操作簡(jiǎn)便,同時(shí)提供了完備的命令體系。因此,對(duì)其進(jìn)行分析和研究具有一定的實(shí)際意義。
            
          vivi簡(jiǎn)介

          vivi是由韓國(guó)Mizi公司開(kāi)發(fā)的一種Bootloader,適合于ARM9處理器,支持S3C2410x處理器,其源代碼可以在http://www.mizi.com網(wǎng)站下載。和所有的Bootloader一樣,vivi有兩種工作模式,即啟動(dòng)加載模式和下載模式。當(dāng)vivi處于下載模式時(shí), 它為用戶提供一個(gè)命令行接口,通過(guò)該接口能使用vivi提供的一些命令集。
            
          vivi運(yùn)行過(guò)程分析

          vivi作為一種Bootloader,其運(yùn)行過(guò)程分成兩個(gè)階段。第一階段的代碼vivi/arch/s3c2410/head.s中定義,大小不超過(guò)10 KB,它包括從系統(tǒng)上電后在0x00000000地址開(kāi)始執(zhí)行的部分。這部分代碼運(yùn)行在Flash中,它包括對(duì)S3C2410的一些寄存器、時(shí)鐘等的初始化并跳轉(zhuǎn)到第二階段執(zhí)行。第二階段的代碼在viviinitmain.c中,主要進(jìn)行一些開(kāi)發(fā)板初始化、內(nèi)存映射和內(nèi)存管理單元初始化等工作,最后會(huì)跳轉(zhuǎn)到boot_or_vivi()函數(shù)中,接收命令并進(jìn)行處理。需要注意的是在Flash中執(zhí)行完內(nèi)存映射后,會(huì)將vivi代碼拷貝到SDRAM中執(zhí)行。如圖1所示,給出了vivi的詳細(xì)的運(yùn)行過(guò)程。

          大多數(shù)Bootloader都分為stage1和stage2兩部分,stage2 的代碼通常用 C 語(yǔ)言來(lái)實(shí)現(xiàn),以便于實(shí)現(xiàn)更復(fù)雜的功能并取得更好的代碼可讀性和可移植性。但是與普通C語(yǔ)言應(yīng)用程序不同的是,在編譯和鏈接Bootloader 程序時(shí),不能使用glibc庫(kù)中的函數(shù)。因此,從那里跳轉(zhuǎn)進(jìn)main()函數(shù),而把main()函數(shù)的起始地址作為整個(gè)stage2執(zhí)行映像的入口點(diǎn)也存在兩個(gè)缺點(diǎn):無(wú)法通過(guò)main()函數(shù)傳遞函數(shù)參數(shù)且無(wú)法處理main()函數(shù)返回的情況。

          一種較為巧妙的方法是利用彈簧床的概念,也就是用匯編語(yǔ)言寫一段trampoline 小程序,并將這段程序作為stage2可執(zhí)行映象的執(zhí)行入口點(diǎn),然后在trampoline匯編小程序中用CPU跳轉(zhuǎn)指令跳入main()函數(shù)中去執(zhí)行。當(dāng)main()函數(shù)返回時(shí),CPU執(zhí)行路徑再次回到trampoline程序。簡(jiǎn)而言之,這種方法的思想就是:用這段 trampoline小程序來(lái)作為main()函數(shù)的外部包裹。

          vivi中的trampoline程序如下:
          @ get read to call C functions     
            ldr sp, DW_STACK_START @ setup stack pointer
            mov fp, #0   @ no previous frame, so fp=0
            mov a2, #0   @ set argv to NULL
            bl main   @ call main
            mov pc, #FLASH_BASE  @ otherwise, reboot;
          正常情況下,程序能夠正常執(zhí)行完畢,但是如果出錯(cuò)了,就回到最后一條語(yǔ)句重新啟動(dòng)系統(tǒng)。


          圖1 vivi運(yùn)行過(guò)程
            
          vivi的移植

          為了使移植工作更加快捷,本文選擇vivi-20030929版本。它不僅提供對(duì)ARM-920T內(nèi)核的支持,而且直接提供了對(duì)于S3C2410x的板級(jí)支持,這使移植工作量相對(duì)減少。

          vivi中與軟件相關(guān)的修改

          vivi作為L(zhǎng)inux系統(tǒng)的啟動(dòng)代碼,在編譯配置時(shí)需要用到函數(shù)庫(kù),包括交叉編譯器庫(kù)和頭文件,交叉編譯開(kāi)關(guān)選項(xiàng)設(shè)置,還包括Linux內(nèi)核代碼中的庫(kù)和頭文件,所以,通常需要修改vivi工程管理文件Makefile。

          vivi中與硬件相關(guān)的初始化

          與具體運(yùn)行在哪一個(gè)處理器平臺(tái)上相關(guān)的文件都存放在vivi/arch/目錄下,本系統(tǒng)使用S3C2410x處理器,對(duì)應(yīng)的目錄為s3c2410。

          其中head.s文件是vivi啟動(dòng)配置代碼,加電復(fù)位運(yùn)行的代碼就是從這里開(kāi)始的。由于該文件中對(duì)處理器的配置均通過(guò)調(diào)用外部定義常數(shù)或宏來(lái)實(shí)現(xiàn),所以針對(duì)不同的平臺(tái),只要是S3C2410x處理器,幾乎不用修改,只要修改外部定義的初始值即可。這部分初始值都在vivi/include/platform/smdk2410.h文件中定義,包括處理器時(shí)鐘、存儲(chǔ)器初始化、通用I/O口初始化以及vivi初始配置等。

          對(duì)不同F(xiàn)lash啟動(dòng)的修改

          vivi能從Nor Flash或Nand Flash啟動(dòng),因此啟動(dòng)程序以及Linux內(nèi)核及根文件系統(tǒng),甚至還包括圖形用戶界面等就需要存放在Nor Flash或Nand Flash中。這樣,作為啟動(dòng)程序的vivi還需要根據(jù)實(shí)際情況來(lái)修改存放這些代碼的分區(qū)。本系統(tǒng)采用64MB Nand Flash、2MB Nor Falsh,需要由vivi進(jìn)行分區(qū)才能運(yùn)行Linux。分區(qū)指定的偏移地址就是代碼應(yīng)該存放并執(zhí)行的地址。

          內(nèi)核啟動(dòng)參數(shù)設(shè)置

          經(jīng)過(guò)修改后,S3C2410x開(kāi)發(fā)板能從Nand Flash中啟動(dòng)運(yùn)行Linux,也能從Nor Flash中啟動(dòng),所以相應(yīng)地也要修改啟動(dòng)命令,如下所示:

          #ifdef CONFIG_S3C2410_N AND_BOOT
          char Linux_cmd[] = "noinitrd root=/dev/bon/2 init=/Linuxrc console=tty0 console=ttyS0 ";
          #else
          char Linux_cmd[] = "noinitrd root=/dev/mtdblock/3 init=/Linuxrc console=tty0 console=ttyS0";
          #endif

          修改并實(shí)現(xiàn)Flash驅(qū)動(dòng)

          移植vivi的最后一步是實(shí)現(xiàn)Flash驅(qū)動(dòng),開(kāi)發(fā)者需要根據(jù)自己系統(tǒng)中具體Flash芯片的型號(hào)及配置,修改驅(qū)動(dòng)程序,使Flash設(shè)備能夠在嵌入式系統(tǒng)中正常工作。如果使用的是驅(qū)動(dòng)尚未支持的Flash芯片,只需仿照其他型號(hào),將Flash型號(hào)加入該驅(qū)動(dòng)程序即可。

          修改Flash驅(qū)動(dòng)的關(guān)鍵一步是對(duì)flash. c文件的修改。flash. c是讀、寫和刪除Flash 設(shè)備的源代碼文件。 由于不同開(kāi)發(fā)板中Flash 存儲(chǔ)器的種類各不相同,所以修改flash. c 時(shí)需參考相應(yīng)的Flash 芯片手冊(cè)。它包括如下幾個(gè)函數(shù):

          unsigned long flash - init(void ),F(xiàn)lash 初始化;
          void flash - print - info(flash - info - t *info),打印Flash信息;
          int flash - erase(flash - info - t*info,ints - first,ints -last),F(xiàn)lash 擦除;
          volatile static int write-hword(flash - info - t*info,ulongdest,ulong data),F(xiàn)lash 寫入;
          int write - buff(flash - info - t *info,uchar *src,ulongaddr,ulong cnt),從內(nèi)存復(fù)制數(shù)據(jù)。

          當(dāng)做好上述的移植工作后,就能對(duì)vivi進(jìn)行編譯了。在編譯vivi之前,需要根據(jù)開(kāi)發(fā)板進(jìn)行適當(dāng)?shù)呐渲?。保存并退出后,?zhí)行“make”命令開(kāi)始編譯。把編譯好的vivi燒到Nor Flash中,加電重啟開(kāi)發(fā)板就能運(yùn)行vivi了。
              
          結(jié)語(yǔ)

          Bootloader是操作系統(tǒng)和硬件的樞紐,相對(duì)于操作系統(tǒng)內(nèi)核來(lái)說(shuō),它是一個(gè)硬件抽象層。它負(fù)責(zé)初始化硬件,引導(dǎo)操作系統(tǒng)內(nèi)核,檢測(cè)各種參數(shù)給操作系統(tǒng)內(nèi)核使用。一個(gè)功能完備的大型Bootloader的工作量,相當(dāng)于一個(gè)小型的操作系統(tǒng)。在嵌入式領(lǐng)域中,操作系統(tǒng)移植的關(guān)鍵在于Bootloader的移植和操作系統(tǒng)內(nèi)核硬件相關(guān)部分的移植。嵌入式Linux操作系統(tǒng)作為開(kāi)發(fā)嵌入式產(chǎn)品的首選,為其選擇一款合適的Bootloader能節(jié)省開(kāi)發(fā)時(shí)間和資金,本文對(duì)于使用vivi啟動(dòng)Linux內(nèi)核具有較好的參考價(jià)值。■

          參考文獻(xiàn)

          1 SUMSUNG.Linux for EduKit-II 2410x.pdf
          2 http://www.mizi.com.vivi源代碼包
          3 王靜,劉夏偉.基于Linux的嵌入式系統(tǒng)的啟動(dòng)設(shè)計(jì).電子科技, 2004.6
          4 王俊卿,劉慶文,楊揚(yáng).NIOS軟核處理器的Linux引導(dǎo)程序U-boot設(shè)計(jì).及嵌入式系統(tǒng)應(yīng)用,2004.12
          5 宋國(guó)軍,張侃諭,林學(xué)龍.嵌入式系統(tǒng)中U-Boot基本特點(diǎn)及其移植方法.及嵌入式系統(tǒng)應(yīng)用. 2004.10
          6 張曉林,崔迎煒等.嵌入式系統(tǒng)設(shè)計(jì)與實(shí)踐. 北京:北京航空航天大學(xué)出版社,2006



          評(píng)論


          相關(guān)推薦

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