新聞中心

ARM移植之BootLoader(1)

作者: 時(shí)間:2016-11-10 來源:網(wǎng)絡(luò) 收藏
BootLoader指系統(tǒng)啟動(dòng)后,在操作系統(tǒng)內(nèi)核運(yùn)行之前運(yùn)行的一段小程序。通過BootLoader,我們可以初始化硬件設(shè)備、建立內(nèi)存空間的映射 圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個(gè)合適的狀態(tài),以便為最終調(diào)用操作系統(tǒng)內(nèi)核準(zhǔn)備好正確的環(huán)境。通常,BootLoader是嚴(yán)重地依賴于硬件而實(shí)現(xiàn)的, 特別是在嵌入式世界。因此,在嵌入式世界里建立一個(gè)通用的 BootLoader 幾乎是不可能的。盡管如此,我們?nèi)匀豢梢詫?duì)BootLoader歸納出一些通用的概念來,以指導(dǎo)用戶特定的BootLoader設(shè)計(jì)與實(shí)現(xiàn)。

   BootLoader 的實(shí)現(xiàn)依賴于CPU的體系結(jié)構(gòu),因此大多數(shù) BootLoader 都分為stage1 和stage2 兩大部分。依賴于CPU體系結(jié)構(gòu)的代碼,比如設(shè)備初始化代碼等,通常都放在 stage1中,而且通常都用匯編語言來實(shí)現(xiàn),以達(dá)到短小精悍的目的。而stage2 則通常用C 語言來實(shí)現(xiàn),這樣可以實(shí)現(xiàn)更復(fù)雜的功能,而且代碼會(huì)具有更好的可讀性和可移植性。

  BootLoader 的 stage1 通常包括以下步驟:

  ·硬件設(shè)備初始化;

  ·為加載Boot Loader的stage2準(zhǔn)備 RAM 空間;

  ·拷貝Boot Loader的stage2 到RAM空間中;

  ·設(shè)置好堆棧;

  ·跳轉(zhuǎn)到 stage2 的 C 入口點(diǎn)。

  Boot Loader的stage2通常包括以下步驟:

  ·初始化本階段要使用到的硬件設(shè)備;

  ·檢測系統(tǒng)內(nèi)存映射(memory map);

  ·將kernel 映像和根文件系統(tǒng)映像從flash上讀到 RAM 空間中;

  ·為內(nèi)核設(shè)置啟動(dòng)參數(shù);

  ·調(diào)用內(nèi)核。

  本系統(tǒng)中的BootLoader參照韓國mizi公司的vivi進(jìn)行修改。

  1.開發(fā)環(huán)境

   我們購買了武漢創(chuàng)維特信息技術(shù)有限公司開發(fā)的具有自主知識(shí)產(chǎn)權(quán)的應(yīng)用于嵌入式軟件開發(fā)的集成軟、硬件開發(fā)平臺(tái)ADT(ARM Development Tools)它為基于ARM 核的嵌入式應(yīng)用提供了一整套完備的開發(fā)方案,包括程序編輯、工程管理和設(shè)置、程序編譯、程序調(diào)試等。

   ADT嵌入式開發(fā)環(huán)境由ADT Emulator for ARM 和ADT IDE for ARM組成。ADT Emulator for ARM 通過JTAG 實(shí)現(xiàn)主機(jī)和目標(biāo)機(jī)之間的調(diào)試支持功能。它無需目標(biāo)存儲(chǔ)器,不占用目標(biāo)系統(tǒng)的任何端口資源。目標(biāo)程序直接在目標(biāo)板上運(yùn)行,通過ARM 芯片的JTAG 邊界掃描口進(jìn)行調(diào)試,屬于完全非插入式調(diào)試,其仿真效果接近真實(shí)系統(tǒng)。

  ADT IDE for ARM 為用戶提供高效明晰的圖形化嵌入式應(yīng)用軟件開發(fā)環(huán)境,包括一整套完備的面向嵌入式系統(tǒng)的開發(fā)和調(diào)試工具:源碼編輯器、工程管理器、工程編譯器(編譯器、匯 編器和連接器)、集成調(diào)試環(huán)境、ADT Emulator for ARM 調(diào)試接口等。其界面同Microsoft Visual Studio 環(huán)境相似,用戶可以在ADT IDE for ARM 集成開發(fā)環(huán)境中創(chuàng)建工程、打開工程,建立、打開和編輯文件,編譯、連接、設(shè)置、運(yùn)行、調(diào)試嵌入式應(yīng)用程序。

  ADT嵌入式軟件開發(fā)環(huán)境 采用主機(jī)-目標(biāo)機(jī)交叉開發(fā)模型。ADT IDE for ARM 運(yùn)行于主機(jī)端,而ADT Emulator for ARM 實(shí)現(xiàn)ADT IDE for ARM 與目標(biāo)機(jī)之間的連接。開發(fā)時(shí),首先由ADT IDE for ARM 編譯連接生成目標(biāo)代碼,然后建立與ADT Emulator for ARM 之間的調(diào)試通道,調(diào)試通道建立成功后,就可以在ADT IDE for ARM 中通過ADT Emulator for ARM 控制目標(biāo)板實(shí)現(xiàn)目標(biāo)程序的調(diào)試,包括將目標(biāo)代碼下載到目標(biāo)機(jī)中,控制程序運(yùn)行,調(diào)試信息觀察等等。


  2.ARM匯編

  ARM本身屬于RISC指令系統(tǒng),指令條數(shù)就很少,而其編程又以C等高級(jí)語言為主,我們僅需要在Bootloader的第一階段用到少量匯編指令

 ?。?)+-運(yùn)算

ADD r0, r1, r2
―― r0 := r1 + r2
SUB r0, r1, r2
―― r0 := r1 - r2

  其中的第二個(gè)操作數(shù)可以是一個(gè)立即數(shù):

ADD r3, r3, #1
―― r3 := r3 + 1

  第二個(gè)操作數(shù)還可以是位移操作后的結(jié)果:

ADD r3, r2, r1, LSL #3
―― r3 := r2 + 8.r1

 ?。?)位運(yùn)算

AND r0, r1, r2
―― r0 := r1 and r2
ORR r0, r1, r2
―― r0 := r1 or r2
EOR r0, r1, r2
―― r0 := r1 xor r2
BIC r0, r1, r2
―― r0 := r1 and not r2

 ?。?)寄存器搬移

MOV r0, r2
―― r0 := r2
MVN r0, r2
―― r0 := not r2

 ?。?)比較

CMP r1, r2
―― set cc on r1 - r2
CMN r1, r2
―― set cc on r1 + r2
TST r1, r2
―― set cc on r1 and r2
TEQ r1, r2
―― set cc on r1 or r2

  這些指令影響CPSR寄存器中的 (N, Z, C, V) 位

  (5)內(nèi)存操作

LDR r0, [r1]
―― r0 := mem [r1]
STR r0, [r1]
―― mem [r1] := r0
LDR r0, [r1, #4]
―― r0 := mem [r1+4]
LDR r0, [r1, #4] !
―― r0 := mem [r1+4] r1 := r1 + 4
LDR r0, [r1], #4
―― r0 := mem [r1] r1 := r1 +4
LDRB r0 , [r1]
―― r0 := mem8 [r1]
LDMIA r1, {r0, r2, r5}
―― r0 := mem [r1] r2 := mem [r1+4] r5 := mem [r1+8]

  {..} 可以包括r0~r15中的所有寄存器,若包括r15 (PC)將導(dǎo)致程序的跳轉(zhuǎn)。

 ?。?)控制流

  例1:

MOV r0, #0 ; initialize counter
LOOP:
ADD r0, r0, #1 ; increment counter
CMP r0, #10 ; compare with limit
BNE LOOP ; repeat if not equal

  例2:

CMP r0, #5
ADDNE r1, r1, r0
SUBNE r1, r1, r2
――
if (r0 != 5) {
r1 := r1 + r0 - r2
}



關(guān)鍵詞: ARM移植BootLoade

評(píng)論


技術(shù)專區(qū)

關(guān)閉