基于ARM的嵌入式BootLoader設(shè)計(jì)與啟動(dòng)過(guò)程
1 引言
近年來(lái),ARM在嵌入式設(shè)備中的應(yīng)用越來(lái)越廣泛。S3C44B0X就是Samsung公司生產(chǎn)的基于ARM7架構(gòu)的微處理器。uCLinux是專(zhuān)門(mén)為無(wú)MMU處理器設(shè)計(jì)的嵌入式操作系統(tǒng),支持ARM、Motorola等處理器。采用ARM+uCLinux作為嵌入式開(kāi)發(fā)平臺(tái),吸取了兩者優(yōu)點(diǎn),是一種比較流行的開(kāi)發(fā)方式。在ARM程序設(shè)計(jì)中,啟動(dòng)代碼是至關(guān)重要的,它不僅初始化硬件系統(tǒng)本身,而且最終引導(dǎo)進(jìn)入操作系統(tǒng),所以啟動(dòng)代碼的設(shè)計(jì)直接影響整個(gè)開(kāi)發(fā)的正常進(jìn)行。本文結(jié)合S3C44B0X的特點(diǎn)詳細(xì)給出了Bootloader設(shè)計(jì)和啟動(dòng)過(guò)程。
2 BootLoader代碼
Bootloader代碼是芯片復(fù)位后進(jìn)入操作系統(tǒng)之前執(zhí)行的一段代碼,主要是為操作系統(tǒng)提供基本的運(yùn)行環(huán)境,由它最終將操作系統(tǒng)啟動(dòng)起來(lái)并將控制權(quán)交給操作系統(tǒng)內(nèi)核。
Bootloader代碼由匯編代碼和C代碼兩部分組成。由于資源有限,Bootloader、uCLinux內(nèi)核映象、文件系統(tǒng)(Ramdisk壓縮映象)通常都是固化在Flash中的。在S3C44B0X架構(gòu)的嵌入式系統(tǒng)中,為了保證上電或復(fù)位時(shí)正常運(yùn)行,Bootloader必須存放在Flash(0x0-0x400000,
4M)中的0x0處,則在硬件設(shè)計(jì)中把Flash接在CPU的nGCS0處[1]。上電后 Bootloader首先完成存儲(chǔ)器、堆棧、寄存器、全局變量和基本硬件模塊的初始化,這由匯編代碼完成,然后將操作系統(tǒng)內(nèi)核與文件系統(tǒng)調(diào)入 SDRAM(0x0c000000-0x0c800000,8M)中,并將PC指針指向操作系統(tǒng)內(nèi)核的入口處,為操作系統(tǒng)的運(yùn)行作好準(zhǔn)備,這由C代碼完成。
3 BootLoader代碼設(shè)計(jì)流程
ARM芯片多數(shù)為復(fù)雜的片上系統(tǒng)(SOC),系統(tǒng)里許多硬件模塊都可由軟件來(lái)設(shè)置。系統(tǒng)的初始化直接聯(lián)系到處理器內(nèi)核和硬件控制器,進(jìn)行編程一般用匯編語(yǔ)言。根據(jù)具體的目標(biāo)系統(tǒng),Bootloader的設(shè)計(jì)流程包括:⑴設(shè)置異常向量表 ⑵初始化存儲(chǔ)器系統(tǒng) ⑶堆棧初始化 ⑷C例程全局變量初始化 ⑸呼叫主程序
3.1 設(shè)置異常中斷向量表
ARM處理器的中斷向量表從地址0x0處開(kāi)始存放,連續(xù)有8×4字節(jié)的空間。在ARM存儲(chǔ)空間里每個(gè)字32位,占4個(gè)字節(jié)??梢酝ㄟ^(guò)圖1來(lái)描述中斷向量表的地址分配。
每當(dāng)有中斷或者異常發(fā)生時(shí),ARM處理器便強(qiáng)制把PC指針指向向量表中對(duì)應(yīng)中斷類(lèi)型的地址值。為了加快中斷響應(yīng),我們?cè)贔lash的0x0地址存放能跳轉(zhuǎn)到0x0c000008地址處中斷向量的跳轉(zhuǎn)指令,即在RAM中建立一個(gè)二級(jí)中斷向量表,起始地址為0x0c000008,除復(fù)位外,其它異常入口地址由Flash跳轉(zhuǎn)得到,如表1所示:
圖 1 中斷向量表 表 1 異常向量表跳轉(zhuǎn)關(guān)系
3.2 初始化存儲(chǔ)器系統(tǒng)
存儲(chǔ)器系統(tǒng)的初始化是指對(duì)Flash、RAM存儲(chǔ)器的地址范圍,數(shù)據(jù)總線(xiàn)寬度及DRAM的刷新等進(jìn)行軟件設(shè)置。設(shè)置對(duì)象是存儲(chǔ)器控制寄存器,芯片不同具體的設(shè)置不同。本文僅以開(kāi)發(fā)中用到S3C44B0X為例,說(shuō)明這部分程序設(shè)計(jì)的過(guò)程。
memsetup: ldr r0, =MEMORY_CONFIG
ldmia r0, {r1-r13}
ldr r0, =0x01c80000
stmia r0, {r1-r13}
其中MEMORY_CONFIG地址處定義了配置rBWSCON, rBANKCONn(n=0-7),rREFRESH,
rBANKSIZE,rMRSRB6,rMRSRB7寄存器的值(依次為0x11000100,0x700,0x700,0x7ffc,0x7568
,0x700,0x700,0x18008,0x18000,0xac03e1,0x16,0x020,0x020)。
圖 2 地址映射關(guān)系
地址重映射通常把位于Flash的0x0處異常向量表映射到更快、更寬(32bit/16bit)的RAM中,并把0地址重新指向到RAM中去.圖2描述了Remap前后的地址映射關(guān)系,復(fù)位時(shí)ROM定位到0x0,實(shí)際的跳轉(zhuǎn)地址為ROM的Reset Handler處,Remap后0x0的ROM替換為RAM,并把中斷向量表拷貝到0x0。Remap的實(shí)現(xiàn)和ARM處理器硬件特性相關(guān)。在 S3C44B0X系統(tǒng)中,既沒(méi)有MMU也不支持Remap,為了實(shí)現(xiàn)快的啟動(dòng)和異常處理速度,在Bootloader程序設(shè)計(jì)中,我們把RAM中的 0x0c000008地址當(dāng)成0x0地址處理,即在這里開(kāi)始存放程序中斷向量,而在Flash的0x0地址存放能跳轉(zhuǎn)到0x0c000008地址處中斷向量的跳轉(zhuǎn)指令。支持Remap的處理器有的通過(guò)寄存器的相應(yīng)Bit位置1來(lái)完成,有的通過(guò)軟件設(shè)計(jì)改寫(xiě)Memory起始地址的Bank寄存器完成[2]。
評(píng)論