當前位置:學問君>學習教育>畢業論文>

基於AT91RM9200的BootLoader設計與實現

學問君 人氣:1.26W
基於AT91RM9200的BootLoader設計與實現
摘 要:隨着微技術和機技術的,微處理器芯片的功能越來越強大,嵌入式技術也越來越受到人們的關注。但是在嵌入式系統設計過程中,Boot Loader的設計是遇到的第一個難點。本文以AT91RM9200爲例,介紹Boot Loader的一般實現流程以及功能更爲強大的u-boot的移植。

關鍵詞:BootLoader AT91RM9200 u-boot移植 嵌入式系統
一、引言

嵌入式系統是以爲中心,以計算機技術爲基礎,軟硬件可裁減來適應系統對功能、可靠性、成本、體積、功耗要求嚴格的專用計算機系統。隨着各種微處理器功能越來越強大以及軟件上操作系統的支援,使得整個嵌入式系統擁有了完整構架。近年來各種嵌如式操作系統也是層出不窮以適應各種不同功能的微處理器。然而如何加載操作系統卻成了大家嵌入式系統遇到的第一個攔路虎。這就是BootLoader,他把嵌入式硬件和嵌入式操作系統銜接起來,對於嵌入式系統後續軟件的開發十分重要,在整個開發中也佔有相當大的比例。BootLoader的功能是引導和加載內核鏡像,是在系統復位後執行的第一段代碼,BootLoader首先完成系統硬件的初始化,包括時鐘的設定、存儲區映射、設定堆棧指針,以及完成處理器和周邊電路和設備正常執行所要的初始化工作,創建內核需要的資訊並將系統的軟硬件帶到一個合適的狀態,然後跳轉到操作系統內核入口,將系統控制權交給操作系統,在此之後系統的執行和BootLoader再無任何關係。u-boot是當前比較流行、功能強大的BootLoader,可以支援多種體系結構。

二、BootLoader主要任務及典型結構

一個嵌入式Linux系統從軟件的角度看通常可以分爲四個層次:引導加載程序、Linux內核、檔案系統、用戶應用程序。如圖2.1所示

BootLoader是依賴於硬件實現的,特別是在嵌入式系統中。不同的體系結構需求的BootLoader是不同的;除了體系結構,BootLoader還依賴於具體的嵌入式板級設備的配置。也就是說,對於兩塊不同的嵌入式板而言,即使它們基於相同的CPU構建,執行在其中一塊電路板上的Boot Loader,未必能夠執行在另一塊電路開發板上。

BootLoader的啓動過程可以是單階段的,也可以是多階段的。通常多階段的BootLoader能提供更爲複雜的功能,以及更好的可移植性。從固態存儲設備上啓動的BootLoader大多數是二階段的啓動過程,也即啓動過程可以分爲stage 1和stage 2兩部分。

用戶應用程序

檔案系統

Linux內核

引導加載程序


圖 2.1

依賴於CPU體系結構的代碼,比如設備初始化、開關中斷、初始化時鐘等,通常都放在stage 1中,而且都用匯編來實現,以達到短小精悍的目的。而stage 2通常用C語言來實現,這樣可以實現較複雜的功能,而且代碼有較好的可讀性和可移植性。

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

(1)初始化各種模式的堆棧和寄存器。

(2)初始化系統時鐘、系統總線速率及一些系統常量。

(3)初始化存儲控制器,如FLASH和SDRAM的大小、類型、數據寬度、地址範圍等

(4)初始化各種I/O口和各種控制器。

(5)爲stage2做準備。

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

(1)初始化本階段要使用到的硬件設備。

(2)檢測系統內存映射(memory map).

(3)將內核映像和根檔案系統映像從flash拷貝SDRAM中。

(4)爲內核設定啓動參數。

(5)調用內核。

綜合起來,整個BootLoader的實現流程如圖2.2所示:

基本硬件初始化

拷貝階段2鏡像至RAM

擴展功能所需硬件初始化

圖 2.2

三、BootLoader的實現

u-boot是當前比較流行、功能強大的BootLoader,而且是通用的免費開放源碼的'Boot Loader程序,可以支援多種體系結構。u-boot是由德國的工程師Wolfgang Denk從8XXROM代碼發展而來的。最新版本是u-boot-1.1.4。現以ATMEL公司生產的AT91RM9200爲例,介紹如何在以AT91RM9200爲核心處理器的最小系統上的u-boot-1.1.0的移植。本系統包括:

flash :4MB

sdram:32MB

1.u-boot原始碼目錄結構

(1)board:和一些已有開發板的檔案,比如Makefile和等都和具體開發板的硬件和地址分配有關。

(2)common:與體系結構無關檔案,實現各種命令的C檔案。

(3)cpu:CPU相關檔案,其中的子目錄都是以u-boot所支援的CPU爲名,比如有子目錄arm926ejs、mips、mpc8260和nios等,每個特定的子目錄中都包括cpu.c和interrupt.c,start.S。其中cpu.c初始化CPU、設定指令Cache和數據Cache等;interrupt.c設定系統的各種中斷和異常,比如快速中斷、開關中斷、時鐘中斷、軟件中斷、預取中止和未定義指令等;start.S是U-BOOT啓動時執行的第一個檔案,它主要是設定系統堆棧和工作方式,爲進入C程序奠定基礎。

(4)disk:disk驅動的分區處理代碼。

(5)doc:u-boot的說明文檔。

(6)drivers:通用設備驅動程序,比如各種網卡、支援CFI的Flash、串口和USB總線等。

(7)fs:支援檔案系統的檔案,U-BOOT現在支援cramfs、fat、fdos、jffs2和registerfs。

(8)include:頭檔案,還有對各種硬件平臺支援的彙編檔案,系統的配置檔案和對檔案系統支援的檔案。

(9)net:與有關的代碼,BOOTP協議、TFTP協議、RARP協議和NFS檔案系統的實現。

(10)lib_arm:與ARM體系結構相關的代碼。

(11)tools:創建S-Record格式檔案 和U-BOOT images的工具。


2.對u-boot-1.1.0的修改和移植

爲了使u-boot-1.1.0支援新的開發板,u-boot已經支援的開發板中選擇一種接近的進行修改。由於u-boot- 1.1.0已經支援ARM-920T內核,所以選擇基於ARM-920T內核的at91rm9200爲模板。相關的原始碼在board/at91rm9200/下。

(1)與at91rm9200相關的u-boot代碼

①在include/configs/at91rm9200dk.h 它包括開發板的CPU、系統時鐘、SDRAM、Flash系統及其它相關配置資訊。

#define PHYS_SDRAM 0X20000000

#define PHYS_SDRAM_SIZE 0X2000000

#define PHYS_FLASH_1 0x10000000

#define PHYS_FLASH_SIZE  0x400000

②在include/asm-arm/AT91RM9200.h, 該檔案描述了at91rm9200寄存器的結構及若干宏定義。具體要4。暫不用修改。

③在include/flash.h中,該檔案定義了flash的屬性

④)在cpu/at91rm9200/目錄下別爲cpu.c、interrupts.c和serial.c等檔案。  

⑤在board/at91rm9200dk/目錄下分別爲flash.c、at91rm9200dk.c, , Makefile,。

⑥flash.c : u-boot讀、寫和刪除Flash設備的原始碼檔案。由於不同開發板中Flash存儲器的種類各不相同,所以,修改flash.c時需參考相應的Flash芯片手冊。它包括如下幾個函數:

unsigned long flash_init (void ),Flash初始化;

void flash_print_info (flash_info_t *info),打印Flash資訊;

int flash_erase (flash_info_t *info, int s_first, int s_last),Flash擦除;

volatile static int write_dword (flash_info_t *info, ulong dest, ulong data),Flash寫入;

int write_buff (flash_info_t *info, uchar *src, ulong addr, ulong cnt),從內存複製數據。

⑦ :linker scripte, 設定u-boot中各個目標檔案的連接地址。

(2)網卡設備控制程序

在drivers/目錄中網口設備控制程序cs8900, bcm570x等, 還可以添加其他網卡驅

int eth_init (bd_t *bd) : 初始化設備;

void eth_halt (void) : 關閉網絡設備;

int eth_send (volatile void *packet,int len) : 發送數據包;

int eth_rx (void) : 接收數據包。

(3)修改Makefile檔案

在u-boot-1.0.0/Makefile中加入

at91rm9200dk_config : unconfig

./mkconfig $(@:_config=) arm at91rm9200 at91rm9200dk

其中“arm”是CPU的種類, at91rm9200 是ARM CPU對應的代碼目

at91rm9200dk是自己開發板對應的目錄。

四、生成目標檔案

先執行make clean,

[zeng@localhost u-boot-1.1.0]$make clean

然後執行at91rm9200dk_config,

[zeng@localhost u-boot-1.1.0]$ make at91rm9200dk_config

Configuring for at91rm9200 board...

再執行make,

[zeng@localhost u-boot-1.1.0]$make
之後會生成三個檔案:

1.u-boot——ELF格式的檔案,可以被大多數Debug程序識別;

2.——二進制bin檔案,純粹的U-BOOT二進制執行代碼,不儲存ELF格式和調試資訊。這個檔案一般用於燒錄到用戶開發板中;

3.——Motorola S-Record格式,可以透過串行口下載到開發板中。

以上工作完成我們可以透過串口將下載到主板的SDRAM中,它會自動執行, 並出現uboot>,這裏我們可以透過串口把, 下載到主板,再用u-boot的提供的寫flash功能分別把, 寫入到flash中,完成以上工作後,對主板跳線選擇片外啓動,板子復位後會自動啓動u-boot

五、結語

BootLoader是操作系統和硬件的樞紐,它爲操作系統內核的啓動提供了必要的條件和參數。在移植過程中,開發人員除了要掌握BootLoader 的結構和工作流程外,還要對相關硬件有一定了解。,移植的u-boot已經能夠穩定地執行在開發板上,而且可以透過Flash和網絡加載內核和檔案系統,爲後續開發,特別是驅動程序的開發奠定了良好基礎。



參考文獻

[1] 李駒光,聶雪媛,王兆衛.ARM系統詳解.北京:清華大學出版社,2004.

[2] 詹容開.BootLoader技術內幕.

[3] .

[4] 杜春雷.ARM體系結構與編程[M].北京:清華大學出版社.2004.

[5] AT91RM9200 User Manual. ATMEL , 2005
TAGS: