linux的幾個內核鏡像格式Image 和 u-boot啟動內核和文件系統時的一些環境變量的設置


關於編譯powerpc linux的幾個Image
參考原文 http://blog.sina.com.cn/s/blog_86a30b0c0100wfzt.html
 
PowerPC架構  Linux和ARM,X86等平台有些差異,PowerPC平台HW參數不是通過命令行方式傳遞到Linux,而是通過傳遞Device tree文件的方式傳遞參數,所以PowerPC平台Linux需要編譯dtb和uImage才能正常加載,另外PowerPC架構linux還提供simpleImage的方式加載,也就是將dtb與uImage或將dtb,uImage與ramdisk.image.gz多個文件整合生產單個simpleImage文件,這種simpleImage文件加載方式適合於沒有bootloader支持的情況下,通過JTAG將simpleImage直接加載到target board內存中運行,對於調試非常方便,下面說說這幾種Image文件的編譯:
 
1,dtb:
 
dtb文件由dts生成,對於任何一個PowerPC處理器板,都要有對應的dts文件,dts文件主要是對目標板的HW參數進行描述,比如我的目標板是evm440(Powerpc440),我編寫了一個evm440.dts文件放到內核arch/powerpc/boot/dts/目錄下.
編譯evm440.dtb文件命令如下:
$ make ARCH=powerpc CROSS_COMPILE=/toolchain/freescale-2010.09/bin/powerpc-linux-gnu- evm440.dtb
編譯成功后會在arch/powerpc/boot/下生成evm440.dtb文件,這就是我們需要的dtb文件.
 
2. uImage:
這個Image應該是地球都知道的,這里就不多說了,編譯命令如下:
$ make ARCH=powerpc CROSS_COMPILE=/toolchain/freescale-2010.09/bin/powerpc-linux-gnu- uImage
 
編譯成功后會在arch/powerpc/boot/下生成uImage文件,這就是我們需要的內核Image文件.
 
3. simpleImage.xxxx和simpleImage.initrd.xxxx:
這里的xxxx是特定目標板名字,我的目標板是evm440,也就是simpleImage.evm440和simpleImage.initrd.evm440。
simpleImage.evm440是包括evm440.dtb與uImage以及simpleboot的單一Image,可以不需要bootloader支持加載.
simpleImage.initrd.evm440是包括evm440.dtb,ramdisk.image.gz與uImage以及simpleboot的單一Image,也是可以不需要bootloader支持加載.
編譯命令如下:
 
$ make ARCH=powerpc CROSS_COMPILE=/usr/toolchain/freescale-2010.09/bin/powerpc-linux-gnu- simpleImage.evm440
 
$ make ARCH=powerpc CROSS_COMPILE=/usr/toolchain/freescale-2010.09/bin/powerpc-linux-gnu- simpleImage.initrd.evm440
 
編譯成功后會在arch/powerpc/boot/下生成:
simpleImage.evm440
simpleImage.evm440.elf
simpleImage.initrd.evm440
simpleImage.initrd.evm440.elf

這些命令格式,另外包括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不到2MuImageuboot專用的映像文件,它是在zImage之前加上一個長度為64字節的“頭”,說明這個內核的版本、加載位置、生成時間、大小等信息;其0x40之后與zImage沒什么區別。uImage64字節的頭結構如下:

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文件夾中,將zImagemkimage放在同一個目錄下,執行:

./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類型,比如armx86mipsppc

-O :==>set operating system to 'os’     :用於指定操作系統,比如freebsdlinuxvxworks

-T :==>set image type to 'type’        :用於指定image類型,比如kernelramdiskfilesystem

-C :==>set compression type 'comp’    :用於指定壓縮類型:nonegzipbzip2

-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),XX0x40或者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/

1.設置MAC 地址:
U-Boot>setenv ethaddr 3e:36:65:ba:6f:be
2.設置IP 地址:
U-Boot>setenv ipaddr 192.168.0.2(好像不行,有新進展在貼出來)
 
3.設置裝載內核和文件系統的信息:

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   //400000fs大小

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啟動內核和根文件下系統時必須要設置的環境變量。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM