樸海光
摘要:嵌入式系統(tǒng)啟動(dòng)是以引導(dǎo)程序開(kāi)始,引導(dǎo)程序會(huì)讓系統(tǒng)啟動(dòng)后處于操作系統(tǒng)的管理之下,然后嵌入式系統(tǒng)才能發(fā)揮它強(qiáng)大的多任務(wù)化的管理功能,但嵌入式系統(tǒng)的引導(dǎo)程序有很多,之間差別很大,對(duì)它的認(rèn)識(shí)也知之甚少,文中以韓國(guó)Mizi公司開(kāi)發(fā)的vivi引導(dǎo)程序?yàn)榇?,以點(diǎn)帶面,詳細(xì)做了剖析。
關(guān)鍵詞:嵌入式S3C2410vivi引導(dǎo)程序
1 概述
引導(dǎo)程序是計(jì)算機(jī)引導(dǎo)系統(tǒng)軟件的一個(gè)重要工具,大家對(duì)80X86微型機(jī)上的引導(dǎo)系統(tǒng)不會(huì)陌生,嵌入式系統(tǒng)的引導(dǎo)程序的作用與其相似,通過(guò)引導(dǎo)程序可以對(duì)系統(tǒng)中的一些主要部件做初始化,對(duì)嵌入式系統(tǒng)來(lái)說(shuō),就是諸如CPU、存儲(chǔ)器件、串行口、網(wǎng)絡(luò)口等部件要做初始配置,相對(duì)于微型機(jī)來(lái)說(shuō),嵌入式系統(tǒng)的存儲(chǔ)管理出于效率的考慮,對(duì)使用有更為精確、嚴(yán)格的要求,引導(dǎo)程序可以分配內(nèi)存空間的映射,將系統(tǒng)的軟件和硬件環(huán)境處于最佳的工作狀態(tài),為下一步操作系統(tǒng)的引導(dǎo)做好準(zhǔn)備工作。
2 vivi引導(dǎo)程序
2.1 vivi簡(jiǎn)介
Vivi是由韓國(guó)Mizi公司面向ARM9處理器開(kāi)發(fā)的引導(dǎo)系統(tǒng),支持S3C2410處理器。它工作于兩種可選模式下,一種是啟動(dòng)加載模式,另一種是下載模式,后面會(huì)給出這兩種模式的具體分析。啟動(dòng)加載模式下,會(huì)完成操作系統(tǒng)的自動(dòng)引導(dǎo),下載模式下,會(huì)通過(guò)一個(gè)命令行接口提供的命令完成相應(yīng)功能。
2.2 vivi程序架構(gòu)分析
Vivi系統(tǒng)是由一段很小的引導(dǎo)程序構(gòu)成,它的代碼包括如下幾個(gè)目錄:arch,init,drivers,lib和include。
①arch子目錄: vivi可以支持很多類型的目標(biāo)板,不同類型的目標(biāo)板會(huì)對(duì)應(yīng)不同的子目錄,文中給出的Vivi引導(dǎo)系統(tǒng)Boot Loader中只包括了S3C2410目錄;②Init: vivi的執(zhí)行就是由這個(gè)目錄的用C語(yǔ)言寫成的main.c文件開(kāi)始執(zhí)行,該目錄下還有一個(gè)名稱為version.c的文件;③drivers:內(nèi)核工作時(shí)的設(shè)備驅(qū)動(dòng)程序都包括于這個(gè)目錄,它又將設(shè)備驅(qū)動(dòng)分為三種類型,分別置于MTD,串口,網(wǎng)絡(luò)三個(gè)目錄下,其中MTD實(shí)現(xiàn)的是核心設(shè)備的驅(qū)動(dòng)管理,它又分為map,nand,nor三個(gè)目錄;④lib:針對(duì)一些平臺(tái)實(shí)現(xiàn)的公共的代碼,用于接口功能的實(shí)現(xiàn);⑤include:實(shí)現(xiàn)頭文件管理,文中S3C2410的頭文件就置于該目錄下,它是頭文件的公共目錄。
3 vivi運(yùn)行流程分析
3.1 vivi初始化階段一(在/arch/s3C2410/head.s文件內(nèi))
3.1.1 硬件初始化
當(dāng)上電或復(fù)位后,vivi啟動(dòng),位于NANDFlash中的前4KB程序便從NANDFlash中由S3C2410自動(dòng)拷貝到一個(gè)叫SteppingStone的4KB的內(nèi)部RAM中,該RAM之后被映射到地址0x00處。此時(shí),也就是vivi前4KB代碼開(kāi)始運(yùn)行,進(jìn)行第一階段的硬件初始化,主要工作為:關(guān)Watchdog Timer,關(guān)中斷,初始化PLL和時(shí)鐘主頻設(shè)定,初始化存儲(chǔ)器控制器。
3.1.2 配置串口
該步初始化串口寄存器。
3.1.3 復(fù)制自身到SDRAM中
當(dāng)初始化串口結(jié)束,vivi開(kāi)始把自身從NANDFlash中復(fù)制到SDRAM中,之后在SDRAM中運(yùn)行。
3.2 vivi初始化階段二(在/init/main.c文件內(nèi))
3.2.1 繼續(xù)初始化實(shí)驗(yàn)系統(tǒng)硬件
通過(guò)board_init()函數(shù)完成,該函數(shù)在/arch/s3c2410/smdk.c中,主要完成兩個(gè)功能,時(shí)鐘初始化(init_time()),以及IO口的配置(set_gpios())。
3.2.2 內(nèi)存映射初始化,內(nèi)存管理單元初始化
通過(guò)mem_map_init()、mmu_init()函數(shù)來(lái)完成,這兩個(gè)函數(shù)在/arch/s3c2410/mmu.c中。該啟動(dòng)代碼,使用NAND設(shè)備作為啟動(dòng)設(shè)備。內(nèi)存映射完后,要使能MMU。
3.2.3 初始化堆
通過(guò)heap_init()函數(shù)完成,該函數(shù)在/lib/head.c中,初始化堆。
3.2.4 初始化mtd設(shè)備
通過(guò)mtd_init()函數(shù)完成,該函數(shù)在/drivers/mtd/maps/s3c2410_flash.c中,初始化mtd設(shè)備。
3.2.5 初始化私有數(shù)據(jù)
通過(guò)init_priv_data()函數(shù)完成,該函數(shù)在/lib/priv_data/rw.c中,初始化私有數(shù)據(jù)。
3.2.6 初始化內(nèi)置命令
通過(guò)init_builtin_cmds()函數(shù)完成,該函數(shù)在/lib/command.c中,初始化內(nèi)置命令。
3.2.7 啟動(dòng)vivi
通過(guò)boot_or_vivi()函數(shù)完成,此時(shí)引導(dǎo)過(guò)程在超級(jí)終端上建立人機(jī)界面,并等待用戶輸入命令。若接收到用戶輸入非回車鍵,進(jìn)入vivi模式,否則,等待一會(huì)兒,系統(tǒng)自啟動(dòng)。
4 vivi的二個(gè)重要命令的分析
當(dāng)vivi處于下載模式時(shí),它為用戶提供一個(gè)命令行接口,通過(guò)該接口能使用vivi提供的一些命令集,下面就給出在這種模式下的三個(gè)重要命令的分析,通過(guò)這二個(gè)命令,能完成與系統(tǒng)相關(guān)的重要功能。
4.1 load命令
load 命令完成加載二進(jìn)制文件到flash或ram中。
格式為:load
其中,
例如,裝載zImage 到flash中。要用命令:vivi> load flash kernel x,或者指定地址和文件大?。簐ivi> load flash 0x800000xc0000 x
4.2 boot命令
boot命令是啟動(dòng)保存在flash或ram中的linux內(nèi)核命令。
命令格式為:boot
其中,
例如,vivi> boot ram,該過(guò)程能使vivi從ram中啟動(dòng)linux內(nèi)核。
5 結(jié)束語(yǔ)
本文給出了嵌入式系統(tǒng)引導(dǎo)程序的一個(gè)特定產(chǎn)品vivi的詳細(xì)的分析,通過(guò)分析,要掌握它的結(jié)構(gòu)、工作過(guò)程,除此之外,運(yùn)行于嵌入式系統(tǒng)下的引導(dǎo)程序有很多,如U-boot,Redboot等,雖然由不同的廠家開(kāi)發(fā),但它們的工作原理是相似的,因此,文中對(duì)vivi的分析,能起到以點(diǎn)帶面的作用。
參考文獻(xiàn):
[1]《基于ARM9嵌入式系統(tǒng)的BootLoader設(shè)計(jì)》,葉林等.《科技信息》2009(11).
[2]《基于s3c2410開(kāi)發(fā)板的Boot Loader的啟動(dòng)分析》,劉軍芳等.《微計(jì)算機(jī)信息》2006(17).
[3]《基于ARM的嵌入式系統(tǒng)Boot Loader啟動(dòng)流程分析》,萬(wàn)永波.《微計(jì)算機(jī)信息》2005(2).