基于ARM的嵌入式BootLoader設(shè)計(jì)與啟動(dòng)過(guò)程
3.5 呼叫主程序
當(dāng)系統(tǒng)初始化完成后,就要轉(zhuǎn)入主程序,可由跳轉(zhuǎn)指令來(lái)完成。這部分代碼為C程序,主要負(fù)責(zé)uCLinux內(nèi)核拷貝、 Ramdisk文件系統(tǒng)加載、設(shè)置啟動(dòng)參數(shù)和串口通信等功能.程序最終完成內(nèi)核壓縮文件和Ramdisk到RAM的拷貝,后跳轉(zhuǎn)到RAM中Linux Kernel的首地址,并交出控制權(quán),到此Bootloader的任務(wù)完成。其中uCLinux在RAM中的空間分配為0x0c000000
-0x0c008000(uCLinux內(nèi)核調(diào)度用),0x0c008000-0x0c300000(uCLinux Kernel),0x0c300000
-0x0c800000(uCLinux Ramdisk)。以下程序?yàn)閡CLinux內(nèi)核和Ramdisk文件系統(tǒng)拷貝過(guò)程,F(xiàn)LASH_UC_KERNEL,F(xiàn)LASH_UC_RAMDISK分別為內(nèi)核和文件系統(tǒng)在Flash的起始地址,RAM_UC
_ZIMAGE,RAM_UC_RAMDISK分別為RAM中uCLinux內(nèi)核和文件系統(tǒng)的起始地址,F(xiàn)LASH_LEN_UC_
KERNEL,F(xiàn)LASH_LEN_UC_RAMDISK分別為兩者大小,拷貝完后,PC指針指向RAM_UC_ZIMAGE。程序主要部分如下:
/* Copy uClinux Kernel */
pSource = (unsigned int *)FLASH_UC_KERNEL;
pDest = (unsigned int *)RAM_UC_ZIMAGE;
for (loopcnt = 0;loopcnt (FLASH_LEN_UC_KERNEL>>2);loopcnt++)
{ *pDest++ = *pSource ++; }
/* Copy ramdisk */
pSource = (unsigned int *)FLASH_UC_RAMDISK;
pDest = (unsigned int *)RAM_UC_RAMDISK;
for (loopcnt = 0;loopcnt (FLASH_LEN_UC_RAMDISK>>2); loopcnt++)
{ *pDest++ = *pSource ++; }
/* Start Kernel */
fp = (UClinux_Entry)RAM_UC_ZIMAGE;
(*fp)(0);
4 uCLinux操作系統(tǒng)啟動(dòng)過(guò)程
本系統(tǒng)采用RAM中啟動(dòng)方式,將Flash中的內(nèi)核先拷貝到RAM的某一段地址區(qū)間,再?gòu)脑搮^(qū)間的首地址運(yùn)行 uCLinux內(nèi)核。當(dāng)Bootloader完成系統(tǒng)初始化和拷貝完內(nèi)核和Ramdisk以后,交出控制權(quán),系統(tǒng)開始從RAM中執(zhí)行uCLinux內(nèi)核的引導(dǎo)程序Head.s,并將控制權(quán)交給它。在uCLinux中,Head.s在uCLinux-dist/linux-2.4.x/arch /armnommu/boot/compressed/head.s
里。Head.s非常關(guān)鍵,它完成了加載內(nèi)核的大部分工作,主要是調(diào)用Misc.c中的解壓內(nèi)核函數(shù) (decompress_kernel)來(lái)完成,另外內(nèi)核的加載還必須知道系統(tǒng)必要的硬件信息,該硬件信息在hardware.h中并被Head.s所引用。最后跳轉(zhuǎn)到調(diào)用內(nèi)核函數(shù)(call_kernel),將控制權(quán)交給解壓后的uCLinux系統(tǒng)[4]。系統(tǒng)啟動(dòng)后將加載Ramdisk文件系統(tǒng),進(jìn)入用戶shell程序。
5 結(jié)束語(yǔ)
本系統(tǒng)采用Bootloader完成操作系統(tǒng)內(nèi)核和文件系統(tǒng)拷貝到RAM的設(shè)計(jì)方法,提高了系統(tǒng)的實(shí)時(shí)性。目前,啟動(dòng)代碼已經(jīng)正常引導(dǎo)uCLinux操作系統(tǒng),并實(shí)現(xiàn)了對(duì)輪式移動(dòng)機(jī)器人驅(qū)動(dòng)系統(tǒng)的控制,該嵌入式系統(tǒng)運(yùn)行穩(wěn)定,完全實(shí)現(xiàn)了設(shè)計(jì)目的。由于所選處理器的關(guān)系,本文的Bootloader是不支持Remap芯片的,但啟動(dòng)裝載程序的原理都一樣,只要稍作修改就可用于支持Remap和MMU的芯片,而且對(duì)于其他操作系統(tǒng)同樣適用。
參考文獻(xiàn)
1 嚴(yán)國(guó)清,熊建設(shè).S3C44B0X中BootLoader的實(shí)現(xiàn).[J].數(shù)據(jù)采集與嵌入式系統(tǒng).2004,(6):40-43
2 姜京梅,郭樹旭.ARM7啟動(dòng)代碼設(shè)計(jì)方法與流程.[J].微計(jì)算機(jī)信息,2004,(20):78-79
3 費(fèi)浙平.基于ARM的嵌入式系統(tǒng)開發(fā)—系統(tǒng)的初始化過(guò)程.[J].單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2003.9,80-83
4 黃克彬,葉梧,馮穗力.基于ARM+uCLinux嵌入式系統(tǒng)啟動(dòng)引導(dǎo)的實(shí)現(xiàn).[J].電子技術(shù)應(yīng)用. http://
www.cvtech.com.cn/tech_detail.asp?newsid=223
評(píng)論