uImage的制作是使用的u-boot工具mkimage,build完u-boot后也會將mkimage build出來到/tools目錄下,可以直接拿來用,它的作用就是在zImage的前面加上64個字節的頭,讓u-boot能夠識別要加載內核的類型、加載地址等。
基本格式:mkimage -n 'linux-3.4.2' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008040 -d zImage uImage
-A 指定CPU的體系結構:(u-boot支持多種的架構,這里應該是arm)
取值??????? 表示的體系結構
alpha?????? Alpha?
arm???????? ?A RM?
x86???????? ?Intel x86
ia64??????? ?IA64
mips?????? ??MIPS
mips64???? MIPS 64 Bit
ppc???????? ?PowerPC
s390?????? ?IBM S390
sh??????????? SuperH
sparc?????? SPARC
sparc64?? SPARC 64 Bit
m68k?????? MC68000
-O 指定操作系統類型,可以取以下值:(u-boot支持多種的OS,這里應該是linux)
openbsd、netbsd、freebsd、4_4bsd、linux、svr4、esix、solaris、irix、sco、dell、ncr、lynxos、vxworks、psos、qnx、u-boot、rtems、artos
-T 指定映象類型,可以取以下值:(u-boot可以加載不同的映像,這里應該是kernel)
standalone、kernel、ramdisk、multi、firmware、script、filesystem
-C 指定映象壓縮方式,可以取以下值:(除了zImage本身是壓縮格式外,u-boot還可以對其再壓縮,這里應該是none)
none 不壓縮
gzip 用gzip的壓縮方式
bzip2 用bzip2的壓縮方式
-a 指定映象在內存中的加載地址,可以于實際加載(如tftp加載)時的地址不相同,也可以相同,詳見后面的解釋。
-e?指定映像運行的入口地址,可以等于加載地址,也可以是加載地址偏移64字節(+0x40)后的地址,詳見后面的解釋。
-n 指定映像名稱
-d 指定【源文件】和生成的【目標文件名】
所以如果使用mkimage生成內核鏡像文件的話,會在內核的前頭加上了64byte的信息,供建立tag之用。bootm命令會首先判斷bootm xxxx 這個指定的地址xxxx是否與-a指定的加載地址是否相同。
(1)如果不同的話會從這個地址開始提取出這個64byte的頭部,對其進行分析,然后把去掉頭部的內核復制到-a指定的load地址中去運行之
(2)如果相同的話那就讓其原封不同的放在那,但-e指定的入口地址會推后64byte,以跳過這64byte的頭部。
?
?
我們來看看這三個地址的不同情況:
1> mkimage -A arm -O linux -T kernel -C none -a 30008000 -e?
30008040 -n linux-2.6.18.8 -d zImage uImage2.6.18.8-8040?
這種情況 ,只能把 uImage download到 30008000的位置上,否則 從 30008040
是啟動不了的。
原因:如果將uImage(加了頭的鏡像文件)下載到不同于指定加載地址的地方,則會進行上面的操作,將去掉頭部的內核拷貝到指定的加載地址,此時加載地址和入口地址需要是相同的,因為已經沒有鏡像頭了,所以此時入口地址也應該為30008000,而不應該再加上64個字節
所以在構建鏡像頭部中的加載地址和入口地址時千萬要考慮下載的地址,否則將會啟動不了。
2> mkimage -A arm -O linux -T kernel -C none -a 30008000 -e?
30008000 -n linux-2.6.18.8 -d zImage uImage2.6.18.8-8000?
這種情況download地址隨便。 還是按上面說的,因為將加載地址和入口地址設置成同樣的地址,在下載到任意地址時,將去掉頭部的內核鏡像拷貝到指定加載地址后,可以直接從加載地址開始啟動。但是要是下載地址和指定加載地址相同呢?也就是下面的:
如果 tftp 下載地址==0x30008000 , 此時因為下載地址和指定加載地址相同,所以就不會搬動,內核直接從指定加載地址自解壓啦,但是因為指定的入口地址也是0x30008000,還是在鏡像頭處,可以看到上面的代碼,如果相同沒有做任何事,只是打印了提示信息,所以還得將入口地址往后推后64個字節還是從 0x30008040 啟動就肯定OK 。
?
所以在制作鏡像頭以及下載地址就有兩種情況:
1,mkimage -n 'linux-2.6.14' -A arm -O linux -T kernel -C none?-a 0x30008000 -e 0x30008000?-d zImage zImage.img
加載地址和入口地址相同
tftp?0x31000000?zImage.img
bootm?0x31000000
下載地址可以任意放。
?
2,mkimage -n 'linux-2.6.14' -A arm -O linux -T kernel -C none?-a 0x30008000 -e 0x30008040?-d zImage zImage.img
入口地址在加載地址后面64個字節
tftp?0x30008000?zImage.img
bootm?0x30008000
下載地址一定要在指定的加載地址上。
- 前言
- FL2440的u-boot-2010.09移植(一)
- FL2440的u-boot-2010.09移植(二)
- FL2440的U-boot-2009.08移植(三)支持Nor FLASH
- FL2440的U-boot-2009.08移植(四) 支持DM900網卡
- FL2440的U-boot-2009.08移植(五)uboot架構中NAND Flash驅動修改
- FL2440如何利用JLINK燒寫U-boot到NAND Flash中
- uboot中的快捷菜單的制作說明
- env_relocate 函數深入分析
- U-boot mkimage指定Linux內核地址時的兩種方式
- 實現u-boot對yaffs/yaffs2文件系統下載的支持