999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于U-boot構建嵌入式Linux的Bootloader

2007-12-31 00:00:00張鳳荔秦志光
計算機應用研究 2007年12期

摘要:

介紹U-boot功能和特點,并以ARM9板MagicArm2410和嵌入式Linux為背景,探討U-boot的移植方法與要點。

關鍵詞:引導加載程序; U-boot; 嵌入式Linux; 移植

中圖分類號:TP316.81文獻標志碼:A

文章編號:1001-3695(2007)12-0238-03

1Bootloader介紹

目前在一些專用板上運行Linux已經越來越流行,從軟件角度看一個嵌入式Linux系統可分為四個層次,即Bootloader、kernel(Linux內核)、root filesystem(根文件系統)和用戶應用程序。

引導加載程序(Bootloader)是系統加電后運行的第一段軟件代碼。它的主要運行任務就是將內核映像從硬盤讀入RAM中,然后跳轉到內核的入口點去運行,即開始啟動操作系統。在嵌入式系統中,通常并沒有PC機上BIOS那樣的固件程序(有的嵌入式CPU也會內嵌一段短小的啟動程序)。因此整個系統的加載啟動任務就完全由Bootloader來完成。通過這段小程序可以初始化硬件設備、建立內存空間的映射圖,從而將系統的軟硬件環境設置為一個合適的狀態。通常,Bootloader是嚴重地依賴于硬件而實現的,特別是在嵌入式世界。因此,在嵌入式世界中建立一個通用的Bootloader幾乎是不可能的。

1.1Bootloader所支持的CPU和嵌入式板

不同的CPU體系結構均有不同的Bootloader,但是有些Bootloader也支持多種體系結構的CPU。要想讓運行在一塊嵌入式板上的Bootloader程序也能運行在另一塊嵌入式板上,通常需要修改Bootloader的源程序。

1.2Bootloader的安裝媒介

系統加電或復位后,通常所有的CPU都從某個由CPU制造商預先安排的地址上取指令。比如,基于ARM7TDMI core的CPU在復位時通常都從地址0x00000000取它的第一條指令。基于CPU構建的嵌入式系統通常都有某種類型的固態存儲設備(如ROM、E2PROM或flash等)被映射到這個預先安排的地址上。因此在系統加電后,CPU將首先執行Bootloader程序。

圖1是一個同時裝有Bootloader、內核的啟動參數、內核映像和根文件系統映像的固態存儲設備的典型空間分配結構圖。

1.3用來控制Bootloader的設備或機制

主機與目標機之間一般通過串口建立連接。Bootloader軟件在執行時通常會通過串口來進行I/O。

1.4Bootloader的操作模式

1)啟動加載(bootloading)模式也稱為自主模式,即Boot-loader從目標機上的某個固態存儲設備上將操作系統加載到RAM中運行,整個過程并無用戶介入。嵌入式產品發布時Bootloader顯然必須工作在這種模式下。

2)下載(downloading)模式目標機上的Bootloader將通過串口連接或網絡連接等通信手段從主機(host)下載文件,如下載內核映像和根文件系統映像等。從主機下載的文件通常首先被Bootloader保存到目標機的RAM中,然后再被Boot-loader寫到目標機上的flash類固態存儲設備中。

1.5Bootloader與主機進行文件傳輸所用通信設備及協議

最常見的情況就是,目標機上的Bootloader通過串口與主機之間進行文件傳輸,傳輸協議通常是xmodem/ymodem/zmodem協議中的一種。但是,串口傳輸的速度是有限的,因此通過以太網連接并借助TFTP 協議來下載文件是個更好的選擇,這也是U-boot所采用的方式。

1.6Bootloader的主要任務與典型結構框架

從操作系統的角度看,Bootloader的總目標就是正確地調用內核來執行。另外,Bootloader的實現依賴于CPU的體系結構,因此大多數Bootloader都分為stage1和stage2兩大部分。依賴于CPU體系結構的代碼,如設備初始化代碼等,通常都放在stage1中,用匯編語言來實現。通常stage2用C語言來實現。這樣可以實現更復雜的功能,代碼會具有更好的可讀性和可移植性。

2U-boot簡介

U-boot(universal boot loader)是遵循GPL條款的開放源碼項目。它不僅僅支持嵌入式Linux系統的引導,還支持NetBSD、VxWorks、QNX、RTEMS、ARTOS和LynxOS嵌入式操作系統。這是U-boot中Universal的一層含義,另外一層含義則是U-boot除了支持PowerPC系列的處理器外,還能支持MIPS、x86、ARM、NIOS、XScale等諸多常用系列的處理器。這兩個特點正是U-boot項目的開發目標,即支持盡可能多的嵌入式處理器和嵌入式操作系統。就目前來看,U-boot對PowerPC系列處理器支持最為豐富,對Linux的支持最完善。

2.1U-boot主要目錄結構

了解U-boot源代碼的目錄結構是非常重要的,因為在向開發板上移植時,往往需要結合具體板的信息來作出相應的修改。而如何修改、在何處修改就需要對U-boot的目錄結構有很深的認識。以下是它的目錄結構以及目錄存放代碼的用途:

board—已經有的目標板相關文件,主要包含SDRAM、flash驅動,如Makefile,U-boot.lds等均與具體開發板的硬件和地址分配有關。

common—獨立于處理器體系結構的通用代碼,與體系結構無關,實現各種命令的C文件。

cpu—與處理器相關的文件其中的子目錄均是以U-boot所支持的CPU為名,如mpc8xx子目錄下含串口、網口、LCD驅動及中斷初始化等文件,start.S是U-boot啟動時執行的第一個文件,它主要是設置系統堆棧和工作方式,為進入C程序奠定基礎。

disk—disk驅動的分區處理代碼。

driver—通用設備驅動,如CFI flash驅動、網卡驅動。

doc—U-boot的說明文檔。

fs—支持文件系統的文件,U-boot現在支持cramfs、fat、fdos、jffs2和registerfs。

examples—可在U-boot下運行的示例程序。

include—U-boot頭文件,尤其configs子目錄下與目標板相關的配置頭文件是移植過程中經常要修改的文件。

lib_xxx—處理器體系相關的文件,如lib_ppc、lib_arm目錄分別包含與PowerPC、ARM體系結構相關的文件。

net—與網絡功能相關的文件目錄,如bootp、nfs、tftp等協議的實現。

post—上電自檢文件目錄,尚有待于進一步完善。

rtc—RTC驅動程序。

lib_arm—與ARM體系結構相關的代碼。

tools—用于創建U-boot S-Record和BIN鏡像文件的工具。

2.2U-boot支持的主要功能

3U-boot的移植

本文主要探討以MagicArm2410為例來移植U-boot的過程,使得大部分開發板移植U-boot作為BootLoader時可以參照。關于如何在Linux環境下建立arm開發環境不進行過多贅述。這里操作系統采用Fedora core4,交叉編譯器為arm-Linux2.95.3。

3.1建立開發板所需要的文件

在U-boot的board目錄下就是其支持的開發板,數量非常多。這里用到的MagicARM2410是在三星公司的smdk2410開發板的基礎上做出的,所以在這選擇smdk2410這款相近的開發板來作相應的修改。

3.1.1在board下建立開發板目錄

#mkdir magicarm2410

#cp smdk2410/* magicarm2410

Magic2410目錄下包含了以下幾個文件:flash.c、lowlevel_init.S、smdk2410.c、u-boot.lds、config.mk和Makefile。

3.1.2建立開發板的硬件信息頭文件

#cd include/configs

#cp smdk2410.h magicarm2410.h

Magicarm2410.h這個文件中定義了開發板很多的硬件信息。

3.2結合具體開發板修改文件

一般來說,雖然U-boot可以支持很多開發板,但是在開發時有些文件還是要注意結合開發板的具體信息來修改,以下是需要注意修改的幾個地方。

3.2.1開發板的配置文件

這個文件就是剛才建立的/include/configs/magicarm2410.h。它包括開發板的CPU、系統時鐘、RAM、flash系統及其他相關的配置信息。由于是復制的smdk2410.h文件,只要參照修改以下幾處:

a)配置這里主要是為了以后下載Linux內核文件,只要保證開發板和Linux主機處于同一網段即可。

#define CONFIG_ETHADDR 00:14:97:0f:0c:de

/*開發板的網卡MAC地址*/

#define CONFIG_NETMASK 255.255.255.0

/*子網掩碼*/

#define CONFIG_IPADDR 192.168.0.1

/*開發板的ip地址*/

#define CONFIG_SERVERIP 192.168.0.2

/*Linux主機的地址*/

b)配置開發板的內存,即SDRAM。

#define CONFIG_NR_DRAM_BANKS1

/* 一塊DRAM */

#define PHYS_SDRAM_10x30000000

/*參照數據手冊得出*/

#define PHYS_SDRAM_1_SIZE0x04000000

/*這個開發板的SDRAM為64 MB*/

c)配置flash的大小,根據數據手冊提供的數據,至于sector的數量是根據/board/magicarm2410/flash.c中的flash_init()函數計算出來的。

#define PHYS_FLASH_SIZE0x00200000

/* 這個開發板有2 MB的NorFlash*/

#define CFG_MAX_FLASH_SECT(35)

/* flash上sector的數量*/

d)如果采用的開發板和所選擇的規格相近的開發板網卡不同,還需要修改配置網卡信息。

#define CONFIG_DRIVER_DM90001

/* 網卡是DM9000 */

#define CONFIG_DM9000_BASE0x08000300

/*網卡硬件地址,參照數據手冊*/

#define DM9000_IOCONFIG_DM9000_BASE

/*網卡I/O端口*/

#define DM9000_DATA CONFIG_DM9000_BASE+4

/*網卡數據端口*/

3.2.2修改makefile文件

U-boot的makefile文件包含了它所支持的開發板,但是這里用到的MagicARM2410并沒有,所以需要添加進去。添加如下:

magicarm2410_config:unconfig

@./mkconfig S(@:_config=) arm arm920t magicarm2410 NULL s3c24x0

這里每個項的意義可以參看U-boot下的mkconfig文件,它的說明如下:

#Parameters:Target Architecture CPU Board [VENDOR] [SOC]

其中:arm是CPU的種類;arm920t是ARM CPU對應的代碼目錄;MagicARM2410是自己開發板對應的目錄;s3c24x0對應的SOC。

3.2.3修改flash.c文件

如果開發板的flash和所選擇的相近開發板并不相同,就需要在/board/magicarm2410/flash.c作相應修改。這里主要修改flash型號,即修改flash_init()和flash_print_info()兩個函數中的flash型號為自己開發板的型號。關于其他內容參見flash的數據手冊修改。

3.3編譯生成目標文件

運行make mrproper(或用distclean);make magicarm2410_config;make最后得到三個文件:

a)U-boot—ELF格式的文件;

b)U-boot.bin—二進制bin文件,純粹的U-boot二進制執行代碼,不保存ELF格式和調試信息,這個文件一般用于燒錄到用戶開發板中;

c)U-boot.srec—Motorola S-Record格式,可以通過串行口下載到開發板中。

3.4下載Bootloader并啟動

通過JTAG將U-boot.bin燒寫到flash的零地址,然后重新啟動,若正常就會從串口看到如下信息,說明Bootloader已經運行了:

U-boot 1.1.4 (May 30 2006-16:01:47)

U-Boot code: 33A00000->33A18A58BSS:->33A1CBD0

RAM Configuration:

Bank #0: 30000000 64 MB

Flash: 2 MB

In: serial

Out: serial

Err: serial

4結束語

U-boot能夠支持多種體系結構的處理器,支持的開發板也越來越多。因為Bootloader完全依賴硬件平臺,所以在新電路板上需要移植U-boot程序。目前U-boot最新的版本是1.1.4,對于沒有包括的或者新的開發板,處理的辦法就是選擇一款相近的開發板,在其基礎上進行相應的修改。

根據以上的具體開發過程,可以得出向其他開發板移植U-boot的經驗,即移植U-boot的工作就是添加開發板硬件相關的文件、配置文件,然后配置編譯。

開始移植之前,先要熟悉硬件電路板和處理器,確認U-boot是否支持新開發板的處理器和I/O設備,最好是 U-boot已經支持一塊非常相似的電路板。這就需要先分析一下U-boot已經支持的開發板,比較出硬件配置最接近的開發板。選擇的原則是,首先處理器相同,其次處理器體系結構相同,然后是以太網接口等外圍接口。還要驗證一下這個參考開發板的U-boot,也要編譯通過。比如本文用到的MagicARM2410,U-boot已經支持與之相近的SMDK2410,就可以基于SMDK2410移植。

Bootloader是操作系統和硬件的樞紐,開發人員除了要掌握Bootloader的結構和工作流程外,還要對相關硬件有一定的了解,所以從頭來構建Bootloader是非常麻煩的。如果基于U-boot構建嵌入式Linux的Bootloader,就可以極大地簡化開發過程。

本文通過對U-boot移植過程的探討,給出了一個針對大多數開發板的操作步驟,在U-boot正常運行以后,便可下載Linux內核和文件系統,進行下一步開發,從而縮短開發周期。

參考文獻:

[1]廖日坤.ARM嵌入式應用開發技術白金手冊[K].北京:中國電力出版社, 2005.

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

[3]毛德操,胡希明.嵌入式系統—采用公開源碼和StrongARM/Xscale處理器[M].杭州:浙江大學出版社,2003.

[4]孫紀坤,張小全.嵌入式Linux系統開發技術詳解—基于ARM[M].北京:人民郵電出版社,2006.

[5]葉順流.基于ARM的嵌入式Linux的研究與實現[D].重慶:重慶大學,2005:30-41.

[6]羅奕.嵌入式Linux裁減及其系統構建的研究與實現[D].長沙:中南大學,2005:15-21.

[7]王亞剛.嵌入式Linux系統移植與裁減技術研究[D].西安:西北大學,2005:19-40.

[8]YAGHMOUR K. Building embedded Linux system[M].[S.l.]: O’Reilly Media, 2004.

“本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文”

主站蜘蛛池模板: 2020极品精品国产| 日本人又色又爽的视频| 国产福利小视频在线播放观看| 女人毛片a级大学毛片免费| 久久黄色免费电影| 一本久道热中字伊人| 成人一区专区在线观看| 日本久久免费| 亚洲一区二区黄色| 中国成人在线视频| 国产亚洲第一页| www亚洲精品| 欧美成人午夜视频| 亚洲人网站| 亚洲 日韩 激情 无码 中出| 国产精品三级av及在线观看| 国产成人永久免费视频| 在线看片免费人成视久网下载| 久久久四虎成人永久免费网站| 蝴蝶伊人久久中文娱乐网| 白丝美女办公室高潮喷水视频 | 噜噜噜综合亚洲| 美女内射视频WWW网站午夜| 性欧美在线| 中文字幕在线欧美| 国产电话自拍伊人| 欧美不卡视频在线| 久久人人爽人人爽人人片aV东京热 | 国产xxxxx免费视频| 尤物精品国产福利网站| 国产一区在线观看无码| 久久毛片免费基地| www.国产福利| 女人18毛片久久| 五月天久久综合国产一区二区| 波多野结衣中文字幕久久| 毛片基地美国正在播放亚洲| 国产精品久久精品| 久久精品嫩草研究院| 国产情精品嫩草影院88av| 美女一级免费毛片| 999精品视频在线| 天天色综网| 午夜福利在线观看入口| 精品国产香蕉伊思人在线| 国产在线观看一区二区三区| 国产成人亚洲无吗淙合青草| 亚洲高清免费在线观看| 不卡午夜视频| JIZZ亚洲国产| 亚洲视频二| 国产精品亚洲专区一区| 少妇高潮惨叫久久久久久| 一区二区三区精品视频在线观看| 久久综合色天堂av| 精品亚洲麻豆1区2区3区| 国产成人亚洲精品色欲AV| 波多野结衣一级毛片| 国内精品久久人妻无码大片高| 一本久道久久综合多人| 国产精品男人的天堂| 尤物亚洲最大AV无码网站| 国产成人一区在线播放| 欧美国产精品不卡在线观看| 国产精品白浆无码流出在线看| 国产精品一线天| 无码av免费不卡在线观看| 欧美在线伊人| 国内99精品激情视频精品| 国产精品亚洲欧美日韩久久| 伊人久热这里只有精品视频99| 国外欧美一区另类中文字幕| 欧美一道本| 日本久久免费| 亚洲大尺码专区影院| 国产91丝袜在线观看| 在线观看国产精品日本不卡网| 91原创视频在线| 任我操在线视频| 色网在线视频| 精品亚洲欧美中文字幕在线看| 国产性生交xxxxx免费|