• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 設計應用 > 引導加載程序vivi 的分析和移植研究

    引導加載程序vivi 的分析和移植研究

    ——
    作者:陜西科技大學 陳艷 時間:2006-12-27 來源:電子設計應用 收藏

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

    關鍵詞

    引言

    Bootloader(引導裝載器)是用于初始化目標板硬件,給嵌入式操作系統提供板上硬件資源信息,并進一步裝載、引導嵌入式操作系統運行的固件。在開發(fā)過程中, Bootloader的編寫往往是設計的主要難點。目前,Bootloader的開發(fā)通常都是基于一些開源的Bootloader(如vivi、U-Boot、Blob、ARMBoot、RedBoot等)而設計,它們在設計思路上有許多相通之處。

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

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

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

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

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

    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í)行完畢,但是如果出錯了,就回到最后一條語句重新啟動系統。


    圖1 vivi運行過程
      
    vivi的移植

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

    vivi中與軟件相關的修改

    vivi作為Linux系統的啟動代碼,在編譯配置時需要用到函數庫,包括交叉編譯器庫和頭文件,交叉編譯開關選項設置,還包括Linux內核代碼中的庫和頭文件,所以,通常需要修改vivi工程管理文件Makefile。

    vivi中與硬件相關的初始化

    與具體運行在哪一個處理器平臺上相關的文件都存放在vivi/arch/目錄下,本系統使用S3C2410x處理器,對應的目錄為s3c2410。

    其中head.s文件是vivi啟動配置代碼,加電復位運行的代碼就是從這里開始的。由于該文件中對處理器的配置均通過調用外部定義常數或宏來實現,所以針對不同的平臺,只要是S3C2410x處理器,幾乎不用修改,只要修改外部定義的初始值即可。這部分初始值都在vivi/include/platform/smdk2410.h文件中定義,包括處理器時鐘、存儲器初始化、通用I/O口初始化以及vivi初始配置等。

    對不同Flash啟動的修改

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

    內核啟動參數設置

    經過修改后,S3C2410x開發(fā)板能從Nand Flash中啟動運行Linux,也能從Nor Flash中啟動,所以相應地也要修改啟動命令,如下所示:

    #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

    修改并實現Flash驅動

    移植vivi的最后一步是實現Flash驅動,開發(fā)者需要根據自己系統中具體Flash芯片的型號及配置,修改驅動程序,使Flash設備能夠在嵌入式系統中正常工作。如果使用的是驅動尚未支持的Flash芯片,只需仿照其他型號,將Flash型號加入該驅動程序即可。

    修改Flash驅動的關鍵一步是對flash. c文件的修改。flash. c是讀、寫和刪除Flash 設備的源代碼文件。 由于不同開發(fā)板中Flash 存儲器的種類各不相同,所以修改flash. c 時需參考相應的Flash 芯片手冊。它包括如下幾個函數:

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

    當做好上述的移植工作后,就能對vivi進行編譯了。在編譯vivi之前,需要根據開發(fā)板進行適當的配置。保存并退出后,執(zhí)行“make”命令開始編譯。把編譯好的vivi燒到Nor Flash中,加電重啟開發(fā)板就能運行vivi了。
        
    結語

    Bootloader是操作系統和硬件的樞紐,相對于操作系統內核來說,它是一個硬件抽象層。它負責初始化硬件,引導操作系統內核,檢測各種參數給操作系統內核使用。一個功能完備的大型Bootloader的工作量,相當于一個小型的操作系統。在嵌入式領域中,操作系統移植的關鍵在于Bootloader的移植和操作系統內核硬件相關部分的移植。嵌入式Linux操作系統作為開發(fā)嵌入式產品的首選,為其選擇一款合適的Bootloader能節(jié)省開發(fā)時間和資金,本文對于使用vivi啟動Linux內核具有較好的參考價值。■

    參考文獻

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



    評論


    相關推薦

    技術專區(qū)

    關閉
    主站蜘蛛池模板: 富民县| 衡阳县| 永善县| 扎赉特旗| 毕节市| 郎溪县| 茌平县| 凉山| 三门峡市| 东乡族自治县| 盐津县| 新化县| 隆子县| 高要市| 平邑县| 宽城| 蓝山县| 云和县| 吴忠市| 五原县| 新干县| 普定县| 桂平市| 廊坊市| 平定县| 潜江市| 建始县| 调兵山市| 三明市| 河北省| 得荣县| 射阳县| 星座| 乐平市| 霍州市| 灵台县| 上犹县| 平顶山市| 泰安市| 边坝县| 扶绥县|