基于ARM9上linux系統(tǒng)的bootloader設計
映射關(guān)系代碼如下:
void mem_mapping_linear(void)
{ unsigned long descriptor_index, section_base, sdram_base, sdram_size;
sdram_base=0x30000000;
sdram_size=0x 4000000;
for(section_base=sdram_base,descriptor_index=section_base>>
20;Ssection_basesdram_base+sdram_size; rdescriptor_index+=1;section_base +=0x100000)
{*(mmu_tlb_base+(descriptor_index))=(section_base>>20)| MMU_OTHER_SECDESC;}
}
4.3.裝載內(nèi)核映像和根文件系統(tǒng)映像
像ARM這樣的嵌入式CPU通常都是在統(tǒng)一的內(nèi)存地址空間中尋址 Flash 等固態(tài)存儲設備的,因此從Flash上讀取數(shù)據(jù)與從 RAM單元中讀取數(shù)據(jù)用一個簡單的循環(huán)就可以完成從Flash 設備上拷貝映像的工作:
其中count為根文件系統(tǒng)映像的大小或內(nèi)核映像的大小。
While(count){
*dest++=*src++;//src為fash中的地址,dest為RAM中的地址
count-=4;}
4.4.置內(nèi)核的啟動參數(shù)
內(nèi)核啟動可以從Nand Flash或Nor Flash中啟動運行linux,需要修改啟動命令如下:
#ifdef CONFIG_S3C2410_NAND_BOOT
Char Linux_cmd[]=“noinit root=/dev/bon/2 init =/Linuxrc console=tty0 console=ttys0”;
#else
CharLinux_cmd[]=“CharLinux_cmd[]=”noinit root=/dev/bon/3 init =/Linuxrc console=tty0 console=ttys0”;
其中noinitrd不使用ramdisk。
root根文件系統(tǒng)所在MTD分區(qū)。
Init內(nèi)核運行入口命令文件。
console 內(nèi)核信息控制臺,ttyS0表示串行口0。
ttys0表示虛擬終端LCD啟動參數(shù)一般都包括root、init和console。
5.結(jié)論
設計bootloader是一項很復雜的工作,需要對硬件資源和所用的操作系統(tǒng)有很深的理解,在實際開發(fā)中可以根據(jù)需要簡化設計,去除不必要的系統(tǒng)功能,這樣可以大大提高程序執(zhí)行的效率和穩(wěn)定性。
本文作者創(chuàng)新點:bootloader隨硬件不同設計也盡相同,但本質(zhì)的原理是一樣的,本文給出了一種層次分明設計簡練較之通用的設計方法,使嵌入式工作者可以快速的了解bootloader的實現(xiàn)從而寫出符合需要的啟動程序。
參考文獻
[1] 萬永波 張根寶 田澤 楊峰,基于ARM的嵌入式系統(tǒng)Bootloader啟動流程分析, 微計算機信息, 2005年,第21卷11-2期,90頁.
[2] 嵌入式linux設計與應用.鄒思軼. 北京:清華大學出版社 2002.
[3] SUMSUANG ELECTRONICS. S3C2410X User’s Manual[Z].Republic of Korea: Sumsang,2003.
[4] 馬學文, 朱明日, 程小輝.嵌入式系統(tǒng)中 Bootloader的設計與實現(xiàn).計算機工程,2005年,第31卷7期,96頁.
評論