基于ARM的嵌入式BootLoader設計與啟動過程
3.5 呼叫主程序
當系統初始化完成后,就要轉入主程序,可由跳轉指令來完成。這部分代碼為C程序,主要負責uCLinux內核拷貝、 Ramdisk文件系統加載、設置啟動參數和串口通信等功能.程序最終完成內核壓縮文件和Ramdisk到RAM的拷貝,后跳轉到RAM中Linux Kernel的首地址,并交出控制權,到此Bootloader的任務完成。其中uCLinux在RAM中的空間分配為0x0c000000
-0x0c008000(uCLinux內核調度用),0x0c008000-0x0c300000(uCLinux Kernel),0x0c300000
-0x0c800000(uCLinux Ramdisk)。以下程序為uCLinux內核和Ramdisk文件系統拷貝過程,FLASH_UC_KERNEL,FLASH_UC_RAMDISK分別為內核和文件系統在Flash的起始地址,RAM_UC
_ZIMAGE,RAM_UC_RAMDISK分別為RAM中uCLinux內核和文件系統的起始地址,FLASH_LEN_UC_
KERNEL,FLASH_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操作系統啟動過程
本系統采用RAM中啟動方式,將Flash中的內核先拷貝到RAM的某一段地址區間,再從該區間的首地址運行 uCLinux內核。當Bootloader完成系統初始化和拷貝完內核和Ramdisk以后,交出控制權,系統開始從RAM中執行uCLinux內核的引導程序Head.s,并將控制權交給它。在uCLinux中,Head.s在uCLinux-dist/linux-2.4.x/arch /armnommu/boot/compressed/head.s
里。Head.s非常關鍵,它完成了加載內核的大部分工作,主要是調用Misc.c中的解壓內核函數 (decompress_kernel)來完成,另外內核的加載還必須知道系統必要的硬件信息,該硬件信息在hardware.h中并被Head.s所引用。最后跳轉到調用內核函數(call_kernel),將控制權交給解壓后的uCLinux系統[4]。系統啟動后將加載Ramdisk文件系統,進入用戶shell程序。
5 結束語
本系統采用Bootloader完成操作系統內核和文件系統拷貝到RAM的設計方法,提高了系統的實時性。目前,啟動代碼已經正常引導uCLinux操作系統,并實現了對輪式移動機器人驅動系統的控制,該嵌入式系統運行穩定,完全實現了設計目的。由于所選處理器的關系,本文的Bootloader是不支持Remap芯片的,但啟動裝載程序的原理都一樣,只要稍作修改就可用于支持Remap和MMU的芯片,而且對于其他操作系統同樣適用。
參考文獻
1 嚴國清,熊建設.S3C44B0X中BootLoader的實現.[J].數據采集與嵌入式系統.2004,(6):40-43
2 姜京梅,郭樹旭.ARM7啟動代碼設計方法與流程.[J].微計算機信息,2004,(20):78-79
3 費浙平.基于ARM的嵌入式系統開發—系統的初始化過程.[J].單片機與嵌入式系統應用,2003.9,80-83
4 黃克彬,葉梧,馮穗力.基于ARM+uCLinux嵌入式系統啟動引導的實現.[J].電子技術應用. http://
www.cvtech.com.cn/tech_detail.asp?newsid=223
評論