Linux
有許多Boot Loader可用,比較常見的有U-boot,vivi,RedBoot等,本課程介紹U-boot的版級移植,對應的硬體平台是S3C2440。
嵌入式
系統中,系統上電或複位後,CPU通常從地址0X00000000處讀取第一條指令開始執行,而Boot Loader就放置與此,他比較類似PC機的Bios。他的工作非常重要:初始化硬體裝置、建立記憶體空間映像圖,將硬體環境帶到一個合適的狀態。
一般我們可以把U-boot的啟動過程分為兩個階段,階段一和階段二,第一階段一般用彙編編寫,第二階段一般用C編寫,具體如下
階段一:
初始化基本的硬體裝置(中斷、關閉處理器的指令、資料Cache)
初始化系統記憶體
設定堆棧
跳轉到第二階段的C語言程式進入點。
階段二:
初始化本階段使用的硬體(串口、乙太網路口等)
檢測系統記憶體映射
將核心鏡像和根檔案系統從Flash讀到記憶體中。
為核心設定啟動參數。
調用核心,將系統控制權交給核心。
下面我們來分析U-boot的原始碼。ftp://ftp.denx.de/pub/u-boot/
下載U-boot 1.2.0
壓縮包u-boot-1.2.0.tar.bz2
通過SSH上傳到使用者的跟目錄/home/21iee
下,解壓:
tar -jxvf u-boot-1.2.0.tar.bz2
通過SSH我們可以看到U-Boot原始碼結構,
u-boot.jpg
(62.46 KB)
2008-5-14 11:08
U-Boot的原始碼高度模組化。其中我們關心的主要目錄有:
Board:U-boot
支援的開發板相關程式原代碼。其中board/SMDK
2410目錄包含了三星官方SMDK2410開發板的源檔案。
Common:
與體系無關的檔案。
cpu:
包含U-Boot所支援的所以CPU的原始碼。S3C2440A屬於ARM920T家族,所以只需要關心cpu/arm920t目錄,其中start.S檔案最終會成為u-boot.bin檔案的第一段代碼。
Drivers:
通用裝置驅動程式,如串口,網口,usb等
Doc:
說明文檔。
fs:
U-Boot支援的檔案系統。
include:
包含的標頭檔目錄。其中include/configs/board_name.h中定義了所以和開發板相關的硬體資源配置參數,如網卡地址、核心啟動參數、實體記憶體映射等。
lib_arm:
與arm體繫結構有關的一些公用介面代碼。
net:
網路相關代碼。
tools:
編譯相關工具。
在動手操作前,不管三七二十一,先編譯一把
(我用的是GCC3.3.2的環境用3.4.1有一個error,可根據第二課內容更改bashrc檔案修改)
make 2410.jpg
(7.35 KB)
2008-5-14 11:51
命令為:Make smdk2410_config
//smdk2410_config 是目標平台。
然後通過 make all
命令編譯,幾分鐘後如果提示
uboot_2410_ok.jpg
(8.6 KB)
2008-5-14 11:51
說明U-Boot已經建立完成。
-----------------------------------------------------------------------------------------------------------------------
U-Boot移植到新的S3C2440A平台上,首先在board目錄下增加一個新的開發板目錄。
1.建立開發板目錄,我取名為hztour2440A
。
在u-boot-1.2.0/board/
下建立目錄 hztour2440A
,該目錄下需要幾個基本檔案:config.mk、flash.c、Makefile、mensetup.S、u-boot.lds
,以及以開發板命名的hztour2440A.c
檔案。
cd board/ cp -arv smdk2410 hztour2440A //我們2440和2410類似,所以我們複雜smdk2410下的所有檔案
mv hztour2440A/smdk2410.c hztour2440A/hztour2440A.c //重新命名為hztour2440A.c
|
2.
在include/configs/
目錄下建立目標板配置標頭檔。
cd include/configs
cp smdk2410.h hztour2440A.h //複製smdk2410.h標頭檔
|
3.修改Makefile檔案,添加編譯項
hztour2440A_config: unconfig @$(MKCONFIG) $(@:_config=) arm arm920t hztour2440A NULL s3c24x0 |
這裡hztour2440A與board/目錄下目標板檔案夾名稱hztour2440A一致。
4.確認編譯環境(可選)
該Makefile
中定義了CROSS_COMPILE的值,用於在交叉編譯時間指定交叉編譯器,預設為
ifeq ($(ARCH),arm)
CROSS_COMPILE = arm-linux- //預設的 交叉編譯器名的首碼,如果用crosstool生產的編譯器,首碼該是
arm-9tdmi-linux-gnu-
endif //也可以直接寫路徑 |
5.修改board/hztour2440A
下的Makefile
COBJS := hztour2440A.o flash.o |
6.測試編譯
make hztour2440A_config
//出現Configuring for hztour2440A board...提示,說明配置成功
make //測試編譯
|
到這裡為止,我們編譯出來的這個u-boot還不
能真正適用於我們的目標板,只是實現了對新目標板的定義,接下來我們還要根據新的目標板的特性來移植,請關注 第四課 Boot Loader 移植(U-boot)之二的內容
作者:hztour 轉載請註明出處