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