zImage和UImage的區別

轉載聲明:http://blog.csdn.net/salkk123/article/details/51762144  侵刪

(1)、內核編譯(make)之後會生成兩個文件,一個Image,一個zImage,其中Image爲內核映像文件,而zImage爲內核的一種映像壓縮文件,Image大約爲4M,而zImage不到2M。

    那麼uImage又是什麼的?它是uboot專用的映像文件,它是在zImage之前加上一個長度爲64字節的“頭”,說明這個內核的版本、加載位置、生成時間、大小等信息;其0x40之後與zImage沒區別。
 
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;
uint8_tih_os;
uint8_tih_arch;
uint8_tih_type;
uint8_tih_comp;
uint8_tih_name[IH_NMLEN]; 
} image_header_t;

    所以,uImage和zImage都是壓縮後的內核映像。而uImage是用mkimage工具根據zImage製作而來的。mkimage工具介紹如下:
 
u-boot裏面的mkimage工具來生成uImage(u-boot源碼包/tools/mkimage.c )
這裏解釋一下參數的意義:
-A ==> set architecture to 'arch'
 
-O ==> set operating system to 'os'
 
-T ==> set image type to 'type' “kernel或是ramdisk”
 
-C ==> set compression type 'comp'
 
-a ==> set load address to 'addr' (hex)
 
-e ==> set entry point to 'ep' (hex)(內核啓動時在此位置查詢完整的內核印象)
 
-n ==> set image name to 'name'
 
-d==> use image data from 'datafile'
 
-x ==> set XIP (execute in place,即不進行文件的拷貝,在當前位置執行)
 
對於ARM linux內核映象用法:
-A arm -------- 架構是arm
-O linux -------- 操作系統是linux
-T kernel -------- 類型是kernel
-C none/bzip/gzip -------- 壓縮類型
-a 20008000 ---- image的載入地址(hex),通常爲0xX00008000
-e 200080XX---- 內核的入口地址(hex),XX爲0x40或者0x00
-n linux-XXX --- image的名字,任意
-d nameXXX ---- 無頭信息的image文件名,你的源內核文件
uImageXXX ---- 加了頭信息之後的image文件名,任意取
 
    原來在這個-C這個參數這裏不太理解,因爲我覺得既然mkimage是用zImage去製作uImage,而本身zImage就是經過壓縮了的,爲什麼這個地方還要有一個壓縮了,後來想了下,覺得可能是這個工具也可以根據最原始的Image去製作uImage,所以就有了這個參數,不深究。即使將zImage經過壓縮後生成uImage的話,我覺得壓縮比也很小。\

關於-a和-e這兩個參數,具體如下:
-a和-e後面跟的分別是image的載入地址和內核的入口地址,兩者可以一樣,也可以不一樣,依情況而定。

    當-a後面指定的地址和bootm xxxx後面的地址一樣時,-e後面的地址必須要比-a後面的地址多0x40,也就是映像頭的大小64個字節。因爲當他們地址一樣時,uboot是不會搬運映像的。
 
    當-a後面指定的地址和bootm xxxx後面的地址不一樣時,uboot會將bootm xxxx地址處的映像搬運到-a指定的地址處,此時,-e和-a必須要一樣,因爲映像頭並沒有搬運過去,載入地址就是內核的入口地址。需要注意的是,因爲uboot要重新搬運內核映像,所以要注意bootm xxxx的地址和-a之間的地址不要導致複製時的覆蓋。
    因爲zImage是經過壓縮而得到的,所以其自身就有解壓縮代碼。
 
(2)、內核編譯(make)之後會生成兩個文件,一個Image,一個zImage,其中Image爲內核映像文件,而zImage爲內核的一種映像壓縮文件,Image大約爲4M,而zImage不到2M。
    那麼uImage又是什麼的?它是uboot專用的映像文件,它是在zImage之前加上一個長度爲64字節的“頭”,說明這個內核的版本、加載位置、生成時間、大小等信息;其0x40之後與zImage沒區別。
    何生成uImage文件?首先在uboot的/tools目錄下尋找mkimage文件,把其copy到系統/usr/local/bin目錄下,這樣就完成製作工具。然後在內核目錄下運行make uImage,如果成功,便可以在arch/arm/boot/目錄下發現uImage文件,其大小比 zImage多64個字節。
    其實就是一個自動跟手動的區別,有了uImage頭部的描述,u-boot就知道對應Image的信息,如果沒有頭部則需要自己手動去搞那些參數。
 
U-boot的U是“通用”的意思。
    zImage 是ARM Linux常用的一種壓縮映像文件,uImage是U-boot專用的映像文件,它是在zImage之前加上一個長度爲0x40的“頭”,說明這個映像文件的類型、加載位置、生成時間、大小等信息。換句話說,如果直接從uImage的0x40位置開始執行,zImage和uImage沒有任何區別。另外,Linux2.4內核不支持uImage,Linux2.6內核加入了很多對嵌入式系統的支持,但是uImage的生成也需要設置。
 
U-Boot具體解釋:www.2cto.com
Universal Boot Loader。普遍的引導程序
    是非常常用的一個引導程序,可作爲主流系統的引導程序,如OpenBSD, NetBSD, FreeBSD,4.4BSD, Linux, SVR4, Esix, Solaris等等,
    當然同時也支持多種常見的cpu處理器,如MIPS、 x86、ARM、NIOS、XScale等
發佈了7 篇原創文章 · 獲贊 45 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章