新聞中心
在嵌入式領(lǐng)域中,Uboot(Universal Bootloader)是一個(gè)非常重要的啟動(dòng)加載程序。它主要運(yùn)行在ROM或FLASH上,用來(lái)加載操作系統(tǒng)內(nèi)核和系統(tǒng)所需的驅(qū)動(dòng)程序等。Uboot的移植對(duì)于嵌入式設(shè)備的開(kāi)發(fā)和調(diào)試有著至關(guān)重要的作用。本文將詳細(xì)介紹Linux Uboot移植的流程和注意事項(xiàng)。

一、準(zhǔn)備工作
在進(jìn)行移植之前,需要先準(zhǔn)備好以下幾個(gè)方面的工作:
1.交叉編譯器:Uboot是通過(guò)交叉編譯器來(lái)生成目標(biāo)平臺(tái)上的可執(zhí)行文件的。因此,需要先下載適用于目標(biāo)平臺(tái)的交叉編譯器,并配置好環(huán)境變量。
2.目標(biāo)設(shè)備的硬件資料:包括處理器型號(hào)、內(nèi)存大小、flash信息等。這些資料對(duì)于Uboot的配置以及設(shè)備樹(shù)(Device Tree)的編寫(xiě)都有著很大的作用。
3.Uboot源代碼:可以通過(guò)官網(wǎng)下載最新的Uboot源代碼。
二、移植流程
1.配置Uboot
Uboot的配置主要有兩種方法:一種是通過(guò)make menuconfig界面進(jìn)行交互式配置,另一種是通過(guò)手動(dòng)編輯配置文件進(jìn)行配置。如果已經(jīng)準(zhǔn)備好了目標(biāo)設(shè)備的硬件資料,可以直接進(jìn)行交互式配置。
在Uboot的主目錄下,執(zhí)行make menuconfig命令可以進(jìn)入配置界面。在該界面中可以進(jìn)行如下幾個(gè)配置:
(1)配置編譯器:需要根據(jù)交叉編譯器的路徑設(shè)置編譯器的交叉編譯前綴。
(2)配置目標(biāo)平臺(tái):根據(jù)目標(biāo)平臺(tái)的處理器型號(hào)設(shè)置對(duì)應(yīng)的CPU類(lèi)型、內(nèi)核啟動(dòng)地址、內(nèi)存大小等。
(3)配置Flash:根據(jù)目標(biāo)設(shè)備的Flash情況,設(shè)置分區(qū)信息、Flash大小等。
(4)配置串口信息:設(shè)置用于串口輸出的波特率、校驗(yàn)位等。
(5)配置網(wǎng)絡(luò)支持:如果需要在Uboot中啟用網(wǎng)絡(luò)支持,則需要按照實(shí)際情況設(shè)置網(wǎng)絡(luò)協(xié)議類(lèi)型和網(wǎng)絡(luò)接口等。
2.生成Uboot可執(zhí)行文件
完成上述配置后,執(zhí)行make命令即可生成Uboot的可執(zhí)行文件(u-boot.bin)。生成的文件可以通過(guò)串口燒錄到目標(biāo)設(shè)備的Flash中。
3.編寫(xiě)設(shè)備樹(shù)
設(shè)備樹(shù)(Device Tree)是一種用來(lái)描述系統(tǒng)硬件信息的數(shù)據(jù)結(jié)構(gòu)。它是一個(gè)以.dts(Device Tree Source)為后綴名的文本文件。在Uboot中,設(shè)備樹(shù)可以用來(lái)描述系統(tǒng)的硬件信息,以幫助內(nèi)核在啟動(dòng)時(shí)正確識(shí)別硬件設(shè)備。
編寫(xiě)設(shè)備樹(shù)需要針對(duì)目標(biāo)設(shè)備的硬件情況進(jìn)行描述,包括CPU、內(nèi)存、Flash等。在設(shè)備樹(shù)中還可以定義設(shè)備驅(qū)動(dòng)、中斷控制器等。
設(shè)備樹(shù)的編寫(xiě)可以使用DTC(Device Tree Compiler)工具進(jìn)行編譯。編譯后會(huì)生成以.dtb(Device Tree Binary)為后綴名的二進(jìn)制文件。
4.燒錄設(shè)備樹(shù)和內(nèi)核
完成設(shè)備樹(shù)的編寫(xiě)后,需要將設(shè)備樹(shù)和內(nèi)核一起燒錄到目標(biāo)設(shè)備中。具體方法可以根據(jù)設(shè)備的Flash信息進(jìn)行選擇,可以將設(shè)備樹(shù)、內(nèi)核和Uboot的可執(zhí)行文件一起燒錄到FLASH中,也可以通過(guò)tftp等方式進(jìn)行燒錄。
5.調(diào)試和測(cè)試
完成燒錄后,可以通過(guò)串口調(diào)試工具對(duì)設(shè)備進(jìn)行調(diào)試和測(cè)試。如果出現(xiàn)問(wèn)題,可以查看調(diào)試信息來(lái)進(jìn)行排查和解決。
三、注意事項(xiàng)
在進(jìn)行Uboot的移植時(shí),需要注意以下幾個(gè)方面:
1.設(shè)備硬件資料:在進(jìn)行Uboot的配置和設(shè)備樹(shù)的編寫(xiě)時(shí)需要準(zhǔn)確地了解目標(biāo)設(shè)備的硬件資料。如果硬件資料不準(zhǔn)確或者錯(cuò)誤,可能會(huì)出現(xiàn)啟動(dòng)失敗等問(wèn)題。
2.交叉編譯器:需要選擇適合目標(biāo)平臺(tái)的交叉編譯器,并設(shè)置好環(huán)境變量。
3.Uboot的配置:需要按照實(shí)際情況進(jìn)行配置,尤其是分區(qū)信息和Flash大小等。
4.設(shè)備樹(shù):設(shè)備樹(shù)需要準(zhǔn)確地描述系統(tǒng)硬件信息,可以參考官方文檔和其他相關(guān)資料進(jìn)行編寫(xiě)。
5.調(diào)試和測(cè)試:移植完成后需要進(jìn)行充分的調(diào)試和測(cè)試,以確保系統(tǒng)的穩(wěn)定性和可靠性。
在進(jìn)行Linux Uboot移植的過(guò)程中,需要仔細(xì)進(jìn)行各項(xiàng)配置和準(zhǔn)備工作,以確保系統(tǒng)的正確性和可靠性。只有充分理解和掌握Uboot的移植流程和注意事項(xiàng),才能為嵌入式設(shè)備的開(kāi)發(fā)和調(diào)試提供保障。
成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián)為您提供網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)頁(yè)設(shè)計(jì)及定制高端網(wǎng)站建設(shè)服務(wù)!
為什么需要移植uboot,還有uboot的作用僅僅是引導(dǎo)嗎
uboot可以再很多種cpu架構(gòu)上運(yùn)行,同時(shí)也支持很多開(kāi)發(fā)板,但是每種cpu架構(gòu)之間有差別,或者開(kāi)發(fā)板的資源不同,假如在某款開(kāi)發(fā)板上能正常引導(dǎo)啟動(dòng)操作系統(tǒng)的話(huà),并不意味著在其他款就能引導(dǎo)啟動(dòng),建立一款統(tǒng)一的bootloader幾乎是不可能的,但是經(jīng)過(guò)大師們的努力,能夠?qū)崿F(xiàn)通過(guò)簡(jiǎn)單的配置改動(dòng),就可以實(shí)現(xiàn)引導(dǎo)啟動(dòng)很多操作系統(tǒng)(也就是bootloader移植)(uboot是bootloader中的一種,因?yàn)槠湓创a是公開(kāi)的,廣受歡迎)
uboot不僅引導(dǎo)linux,還初始化開(kāi)發(fā)板上的其他組件,如flash,serial,led,vfd等板上的設(shè)備,這個(gè)也是UBOOT中改的比較多的,有什么組件初始化什么,所以有移植一說(shuō),即改成適合自己的開(kāi)發(fā)板~~~。
打個(gè)簡(jiǎn)單比方,你用的是WINBOND的FLASH,我用的是Spanion的FLASH,我拿你的代碼過(guò)來(lái),F(xiàn)LASH是不能正常工作的
linux系統(tǒng)如何傳遞信息給uboot
#make at91rm9200dk_config
#make oldcnofig //使用dk板默認(rèn)配置
如果想定制,可以繼續(xù)執(zhí)行
#make menuconfig
#make Image
#/usr/local/arm/2.95.3/bin/arm-linux-objcopy -O binary -S vmlinux linux.bin
#gzip -v9 linux.bin
#mkimage -A arm -O linux -C gzip -a 0xe 0xd linux.bin.gz uImage
這樣我們得到了Linux啟動(dòng)壓縮內(nèi)核uImage,默認(rèn)運(yùn)行地址為0x,
還有一個(gè)RAM啟動(dòng)盤(pán)-名字為ramdisk-rmk7,在普通的PC機(jī)上叫initrd-2.4.20-8.img,在
/boot/grub/menu.lst文件中,我們可以看到它的使用方法穗閉:
***********************
root (hd0,6)
kernel /boot/vmlinuz-2.4.20-8 ro root=LABEL=/ ##########內(nèi)核文件
initrd /boot/initrd-2.4.20-8.img##########RAM啟動(dòng)盤(pán)文件
***********************
ramdisk-rmk7的默認(rèn)運(yùn)行地址為0x,
只要有上邊的兩個(gè)文件,Linux內(nèi)核就能夠正常的工作了。
uBoot中進(jìn)行如下設(shè)置
Uboot > tftpuImage##########裝載內(nèi)核到內(nèi)存處
Uboot > tftpramdisk-rmk ##########裝載RAM啟動(dòng)盤(pán)到處
Uboot > setenv bootargs root=/dev/ram rw initrd=0x,ramdisk_size=15360 console=ttyS0,mem=32M
Uboot > bootm
如上是通過(guò)tftp直接將內(nèi)核文件uImage和RAM啟動(dòng)盤(pán)加載到內(nèi)存中,然后運(yùn)行,下面講講如何
將這兩個(gè)文件固化到Flash中,然后通過(guò)Flash進(jìn)行加載啟動(dòng):
1)將RAM啟動(dòng)盤(pán)固化到c為起始地址的Flash中
U-Boot > tftpPATH/ramdisk-rmk7
U-Boot > cp.bcramdisk_size
2)將uImage內(nèi)核鏡像固陸衫化到緊跟RAM盤(pán)存儲(chǔ)空間之后
U-Boot > tftpPATH/uImage
U-Boot > cp.bc+ramdisk_size image_size
3)存儲(chǔ)之后,就要配置uBoot啟動(dòng)加載參數(shù)了
U-Boot > setenv ramdisk cp.b c00 ramdisk_size
U-Boot > setenv image cp.b c+ramdisk_sizeimage_size setenv boot bootm
U-Boot > setenv bootcmd run ramdisk\早族腔; run image\; run boot
U-Boot > saveenv
U-Boot > run bootcmd
*************************************************
arch/arm/Makefile
//內(nèi)核運(yùn)行虛擬地址TEXTADDR = 0xC
*************************************************
arch/arm/boot/Makefile
//內(nèi)核加載地址ZRELADDR = 0x
*************************************************
arch/arm/boot/compressed/Makefile
//自解壓程序地址ZTEXTADDR = 0x
(linux-2.4.19-rmk7內(nèi)核的自解壓函數(shù)gunzip位于
/lib/inflate.c中,為gzip-1.0.3版本,現(xiàn)在在PC上使用gzip
函數(shù)壓縮出來(lái)的文件不能被gzip-1.0.3版本的gunzip識(shí)別,所以linux-2.4.19-rmk7
內(nèi)核自解壓的功能等于不能使用,默認(rèn)值ZTEXTADDR= 0x
表示不使用。(只能通過(guò)uBoot的gunzip解壓加載)
)
***********************************************
//uImage存放地址= 0x
***********************************************
mkimage -A arm -O linux -C gzip -a 0xe 0xd linux.bin.gz uImage
-A:CPU類(lèi)型
-O:操作系統(tǒng)
-C:采用的壓縮方式
-a:內(nèi)核加載地址
-e:內(nèi)核入口地址
***********************************************
uBoot的do_bootm(cmd_tbl_t *cmdtp, int flag, int argc, char *argv);
函數(shù)將檢驗(yàn)存放到0x地址處的經(jīng)過(guò)mkimage格式化的uImage數(shù)據(jù)的頭部
typedef struct image_header {
uint32_t ih_magic; /* Image Header Magic Number */
uint32_t ih_hcrc; /* Image Header CRC Checksum */
uint32_t ih_time; /* Image Creation Timestamp */
uint32_t ih_size; /* Image Data Size */
uint32_t ih_load; /* Data Load Address */
uint32_t ih_ep; /* Entry Point Address */
uint32_t ih_dcrc; /* Image Data CRC Checksum */
uint8_t ih_os; /* Operating System */
uint8_t ih_arch; /* CPU architecture */
uint8_t ih_type; /* Image Type */
uint8_t ih_comp; /* Compression Type */
uint8_t ih_name; /* Image Name */
}image_header_t;
(ih_ep值為0x,ih_load值為0x)
如果頭部各個(gè)域值和crc合法,那么do_bootm將調(diào)用如下gunzip解壓函數(shù)對(duì)
0x+sizeof(image_header_t)地址處的壓縮內(nèi)核進(jìn)行解壓:
gunzip((void*)ntohl(hdr->ih_load),0x400000,data,(int*)&len);
1.hdr->ih_load 為輸出數(shù)據(jù)地址0x
2.0x為gunzip解壓輸出數(shù)據(jù)上限值-4M
3.data為輸入數(shù)據(jù)地址data=0x+sizeof(image_header_t);
4.Len為輸入數(shù)據(jù)長(zhǎng)度len = ntohl(hdr->ih_size );
解壓完成后將會(huì)存儲(chǔ)解壓后數(shù)據(jù)的實(shí)際大小
壓縮的Linux內(nèi)核文件uImage,經(jīng)由gunzip解壓函數(shù)后,通過(guò)
do_bootm_linux (cmdtp, flag, argc, argv,addr, len_ptr, verify);
函數(shù)向Linux內(nèi)核傳遞內(nèi)核運(yùn)行所需的5個(gè)參數(shù)
kernel = (void (*)(bd_t *, ulong, ulong, ulong, ulong))hdr->ih_ep ;
1.hdr->ih_ep 為0x
/*
* Linux Kernel Parameters:
* r3: ptr to board info data
* r4: initrd_start or 0 if no initrd
* r5: initrd_end – unused if r4 is 0
* r6: Start of command line string
* r7: End of command line string
*/
(*kernel) (kbd, initrd_start, initrd_end, cmd_start, cmd_end);
這樣完成了Linux系統(tǒng)啟動(dòng)所需要5個(gè)參數(shù)的傳遞,至此uBoot的工作已經(jīng)結(jié)束
Linux啟動(dòng)后U-Boot就基本沒(méi)有用了。U-Boot將一些信息傳給Linux,纖薯然后引導(dǎo)Linux。
不知道你的U-Boot能不能進(jìn)入命毀擾者令行界面?你可以修改Linux的MTD分區(qū),將新的Linux和文件系統(tǒng)燒寫(xiě)在其他的MTD分李哪區(qū),然后在U-Boot中引導(dǎo)新的linux和文件系統(tǒng)。
uboot移植問(wèn)題: ERROR: common/libcommon.a(crc.o) uses VFP instructions, whereas u-boot does not
個(gè)人認(rèn)為是版本兼容性問(wèn)題
linux uboot的移植過(guò)程的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于linux uboot的移植過(guò)程,深度解析:Linux Uboot的移植流程簡(jiǎn)介,為什么需要移植uboot,還有uboot的作用僅僅是引導(dǎo)嗎,linux系統(tǒng)如何傳遞信息給uboot,uboot移植問(wèn)題: ERROR: common/libcommon.a(crc.o) uses VFP instructions, whereas u-boot does not的信息別忘了在本站進(jìn)行查找喔。
香港云服務(wù)器機(jī)房,創(chuàng)新互聯(lián)(www.cdcxhl.com)專(zhuān)業(yè)云服務(wù)器廠商,回大陸優(yōu)化帶寬,安全/穩(wěn)定/低延遲.創(chuàng)新互聯(lián)助力企業(yè)出海業(yè)務(wù),提供一站式解決方案。香港服務(wù)器-免備案低延遲-雙向CN2+BGP極速互訪(fǎng)!
網(wǎng)頁(yè)標(biāo)題:深度解析:LinuxUboot的移植流程簡(jiǎn)介(linuxuboot的移植過(guò)程)
本文網(wǎng)址:http://www.fisionsoft.com.cn/article/cdgdeec.html


咨詢(xún)
建站咨詢(xún)
