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