參考原文 http://blog.sina.com.cn/s/blog_86a30b0c0100wfzt.html
這些命令格式,另外包括cuImage,在Document/powerpc/bootwrape文件中有說明。
附
1. 在修改內核配置時,要在arch/powerpc/boot/dts/目錄下使用新的設備樹文件(通常參考相似的設備樹文件),如p2020stm1.dts;
2. 修改扳級文件,在arch/powerpc/platform/85xx/目錄下(通常參考相似文件),如 cp mpc85xx_rdb.c p2020_stm1.c,並修改好這個目錄下的Makefile 和Kconfig文件;
3. 內核根目錄下.config可以參考arch/powepc/configs/目錄下的配置,如mpc85xx_smp_defconfig;
4. 編譯 make cuImage.p2020stm1。 cuImage 對應命令格式, p2020stm1 對應設備樹文件。為了使命令中的p2020stm1能找到對應的CPU,還需要修改文件arch/powerpc/boot/wraper文件,添加"|*-p2020*"內容。
194 *-mpc85*|* .....
195 platformo=$object/cuboot-85xx.o
經過這四個過程基本OK
[轉]Linux內核zImage\Image\uImage之區別及uImage的制作
http://zh5202.blog.163.com/blog/static/178025195201210535458755/
一、Image、zImage和uImage的區別
內核編譯(make)之后會生成兩個文件,一個是Image,一個是zImage,其中Image為內核映像文件,而zImage為內核的一種映像壓縮文件,Image大約為4M,而zImage不到2M。uImage是uboot專用的映像文件,它是在zImage之前加上一個長度為64字節的“頭”,說明這個內核的版本、加載位置、生成時間、大小等信息;其0x40之后與zImage沒什么區別。uImage的64字節的頭結構如下:
typedef struct image_header{
uint32_tih_magic;
uint32_tih_hcrc;
uint32_tih_time;
uint32_tih_size;
uint32_tih_load;
uint32_tih_ep;
uint32_tih_dcrc;
uint32_tih_os;
uint32_tih_arch;
uint32_tih_type;
uint32_tih_comp;
uint32_tih_name[IH_NMLEN];
}image_header_t;
所以uImage和zImage都是壓縮后的內核映像,而uImage是uboot專用的映像文件,是用mkimage工具根據zImage制作而來的。
二、uImage的制作
(編譯uboot源碼,編譯成功后載uboot/tools目錄下會生成mkimgage工具,將mkimage工具拷貝到/usr/bin/目錄下即可。)
mkimage工具
內核編譯完后zImage在內核根目錄下,mkimage工具在u-boot根目錄下的tools文件夾中,將zImage和mkimage放在同一個目錄下,執行:
./mkimage -A arm -O linux -T kernel -C none -a 30008000 -e 30008000 -n linux-2.6.26 -d zImage uImage2.6.26
就將zImage轉換成uImage了。
【mkimage的命令參數:】
-A :==>set architecture to 'arch’ :用於指定CPU類型,比如arm、x86、mips、ppc
-O :==>set operating system to 'os’ :用於指定操作系統,比如freebsd、linux、vxworks
-T :==>set image type to 'type’ :用於指定image類型,比如kernel、ramdisk、filesystem
-C :==>set compression type 'comp’ :用於指定壓縮類型:none、gzip、bzip2
-a :==>set load address to 'addr’(hex) :用於指定uImage的加載地址
-e :==>set entry point to 'ep’(hex) :用於指定內核的入口地址,一般是:uImage的載入地址+0x40(信息頭的大小)
-n :==>set image name to 'name’ :用於指定uImage在頭結構中的命名
-d :==>use image data from 'datafile’ :用於指定無頭信息的zImage文件名
-x :==>set XIP(execute in place) :用於設置執行位置
如對於ARM Linux內核映像常用選項為:
-A arm :==> 架構是arm
-O linux :==> 操作系統是linux
-T kernel :==> 類型是kernel
-C none/bzip/gzip :==> 壓縮類型
-a 0x40008000 :==> uImage的載入地址(hex),通常為0xX0008000
-e 0x40008040 :==> 內核的入口地址(hex),XX為0x40或者0x00
-n linux-xxx :==> uImage的名字,任意
-d namexxx :==> 無頭信息的zImage文件名,為源內核文件
uImagexxx :==> 加了頭信息之后的zImage文件名,任意
【例子:】
./mkimage -A arm -O linux -T kernel -C none -a 30008000 -e 30008040 -d zImage uImage
【注意:】
-a和-e后面跟的分別是image的載入地址和內核的入口地址,兩者可以一樣,也可以不一樣,依據如下情況而定:
當-a后面指定的地址和bootm xxxx后面的地址一樣時,-e后面的地址必須要比-a后面的地址多0x40,也就是映像頭的大小64個字節。因為當他們地址一樣時,uboot是不會搬運映像的;
當-a后面指定的地址和bootm xxxx后面的地址不一樣時,uboot會將bootm xxxx地址處的映像文件搬運到-a指定的地址處,此時,-e和-a必須要一樣,因為映像頭並沒有搬運過去,載入地址就是內核的入口地址。需要注意的是,因為uboot要重新搬運內核映像,所以要注意bootm xxxx的地址和-a之間的地址不要導致復制時的覆蓋。
P2020項目中,還看見看了使用這命令制作根文件系統鏡像
mkimage -A ppc -O linux -T ramdisk -C gzip -n ${rooot_ver} -d rootfs.img.gz rootfs.uboot
[轉]uImage、zImage、bzImage、vlinzx區別
http://hi.baidu.com/cbncb/item/389b155c62acd316abf6d748
在網絡中,不少服務器采用的是Linux系統。為了進一步提高服務器的性能,可能需要根 據特定的硬件及需求重新編譯Linux內核。編譯Linux 內核,需要根據規定的步驟進行,編譯內核過程中涉及到幾個重要的文件。比如對於RedHat Linux,在/boot目錄下有一些與Linux內核有關的文件 .
編譯過RedHat Linux內核的人對其中的System.map、vmlinuz、initrd-2.4.7-10.img印象可能比較深刻,因為編譯內核過程中涉及到這些文件的建立等操作。那么這幾個文件是怎么產生的?又有什么作用呢?
對於Linux內核,編譯可以生成不同格式的映像文件,例如:
# make zImage
# make uImage
# make bzImage
zImage是ARM Linux常用的一種壓縮映像文件不能超過512KB,bzImage 即bigzImage ,二者的內核都是gzip壓縮的
uImage是U-boot專用的映像文件,它是在zImage之前加上一個長度為0x40的“頭”,說明這個映像文件的類型、加載位置、生成時間、大小等信息。換句話說,如果直接從uImage的0x40位置開始執行,zImage和uImage沒有任何區別。另外,Linux2.4內核不支持uImage,Linux2.6內核加入了很多對嵌入式系統的支持,但是uImage的生成也需要設置。
一、vmlinuz
vmlinuz是可引導的、壓縮的內核。“vm”代表“Virtual Memory”。Linux 支持虛擬內存,不像老的操作系統比如DOS有640KB內存的限制。Linux能夠使用硬盤空間作為虛擬內存,因此得名“vm”。vmlinuz是可執行 的Linux內核,它位於/boot/vmlinuz,它一般是一個軟鏈接,比如圖中是vmlinuz-2.4.7-10的軟鏈接。
vmlinuz的建立有兩種方式。
一是編譯內核時通過“make zImage”創建,手動拷貝到/boot目錄下面。zImage適用於小內核的情況,它的存在是為了向后的兼容性。
二是內核編譯時通過命令make bzImage創建,然后手動拷貝至/boot目錄下。bzImage是壓縮的內核映像,需要注意,bzImage不是用bzip2壓縮的,bz表示“big zImage”。 bzImage中的b是“big”意思。 zImage(vmlinuz)和bzImage(vmlinuz)都是用gzip壓縮的。它們不僅是一個壓縮文件,而且在這兩個文件的開頭部分內嵌有gzip解壓縮代碼。所以你不能用gunzip或gzip –dc解包vmlinuz。
內核文件中包含一個微型的gzip用於解壓縮內核並引導它。兩者的不同之處在於,老的zImage解壓縮內核到低端內存(第一個 640K),bzImage解壓縮內核到高端內存(1M以上)。如果內核比較小,那么可以采用zImage或bzImage之一,兩種方式引導的系統運行 時是相同的。大的內核采用bzImage,不能采用zImage。
vmlinux是未壓縮的內核,vmlinuz是vmlinux的壓縮文件。
二、initrd-x.x.x.img
initrd是“initial ramdisk”的簡寫。initrd一般被用來臨時的引導硬件到實際內核vmlinuz能夠接管並繼續引導的狀態。圖中的initrd-2.4.7-10.img主要是用於加載ext3等文件系統及scsi設備的驅動。
比如,使用的是scsi硬盤,而內核vmlinuz中並沒有這個scsi硬件的驅動,scsi模塊是存儲在根文件系統的/lib/modules下的,那么在裝入scsi模塊之前,內核不能加載根文件系統。為了解決這個問題,可以引導一個能夠讀實際內核的initrd內核並用initrd修正 scsi引導問題。initrd-2.4.7-10.img是用gzip壓縮的文件,initrd實現加載一些模塊和安裝文件系統等功能。
initrd映象文件是使用mkinitrd創建的。mkinitrd實用程序能夠創建initrd映象文件。這個命令是RedHat專有的(這也是為什么,在Linux內核包里/Documentation/Changes里面沒有提到要將mkinitrd升級)。其它Linux發行版或許有相應的命令。這是個很方便的實用程序。具體情況請看幫助:man mkinitrd下面的命令創建initrd映象文件。
initrd映象文件是使用mkinitrd創建的。mkinitrd實用程序能夠創建initrd映象文件。這個命令是RedHat專有的。其它Linux發行版或許有相應的命令。這是個很方便的實用程序。具體情況請看幫助:man mkinitrd下面的命令創建initrd映象文件。
三、uImage文件
vmlinux是內核文件,zImage是一般情況下默認的壓縮內核映像文件,壓縮vmlinux,加上一段解壓啟動代碼得到。而uImage是u-boot使用bootm命令引導的Linux壓縮內核映像文件格式,是使用工具mkimage對普通的壓縮內核映像文件(zImage)加工而得。它是uboot專用的映像文件,它是在zImage之前加上一個長度為 64字節的“頭”,說明這個內核的版本、加載位置、生成時間、大小等信息;其0x40之后與zImage沒區別。
由於bootloader一般要占用0X0地址,所以,uImage相比zImage的好處就是可以和bootloader共存。
其實就是一個自動跟手動的區別,有了uImage頭部的描述,u-boot就知道對應Image的信息,如果沒有頭部則需要自己手動去搞那些參數。
如何生成uImage文件?首先 在uboot的/tools目錄下尋找mkimage文件,把其copy到系統/usr/local/bin目錄下,這樣就完成制作工具。然后在內核目錄下運行make uImage,如果成功,便可以在arch/arm/boot/目錄下發現uImage文件,其大小比zImage多64個字節。
此外,平時調試用uImage,不用去管調整了哪些東西;zImage則是一切OK后直接燒0X0。開機就運行。
u-boot啟動內核和文件系統時的一些環境變量的設置
http://wk2325272.blog.163.com/blog/static/1017654482011101731148777/
setenv bootcmd cp.b 0x00030000 0x21500000 0x00200000\;cp.b 0x00300000 0x21100000 0x00400000\;bootm 0x21500000 // 0x00030000表示內核在NAND FLASH中的起始地址,0x21500000表示裝載到SDRAM中的位置, //0x00200000表示內核文件的大小
4.設置讀內核和文件系統的信息:
set ker nand read 21500000 30000 200000 //200000為內核大小
set fs nand read 21100000 300000 400000 //400000為fs大小
5.設置啟動信息:
set bootcmd run boot
set boot run fs\;run ker\;bootm 21500000
set bootargs mem=64M console=ttySAC0,115200 initrd=0x21100000,4M root=/dev/ram0 rw
6.保存環境變量:
saveenv
注意:3到6從u-boot啟動內核和根文件下系統時必須要設置的環境變量。