1. 程式人生 > >Image和zImage區別

Image和zImage區別

-----------------------------------------------------------------------------轉載----------------------------------------------------------------------------------

原文http://blog.csdn.net/yi412/article/details/19131549

核心編譯(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的生成也需要設定,這個以後我會介紹。

幾種linux核心檔案的區別:

1、vmlinux  編譯出來的最原始的核心檔案,未壓縮。

2、zImage   是vmlinux經過gzip壓縮後的檔案。

3、bzImage bz表示“big zImage”,不是用bzip2壓縮的。兩者的不同之處在於,zImage解壓縮核心到低端記憶體(第一個640K),bzImage解壓縮核心到高階記憶體(1M以上)。如果核心比較小,那麼採用zImage或bzImage都行,如果比較大應該用bzImage。

4、uImage   U-boot專用的映像檔案,它是在zImage之前加上一個長度為0x40的tag。

5、vmlinuz  是bzImage/zImage檔案的拷貝或指向bzImage/zImage的連結。

6、initrd   是“initial ramdisk”的簡寫。一般被用來臨時的引導硬體到實際核心vmlinuz能夠接管並繼續引導的狀態

      一般情況下都在生成vmlinux後,再對核心進行壓縮成為zImage,壓縮的目錄是

kernel/arch/arm/boot。

     下載到 flash 中的是壓縮後的zImage檔案,zImage是由壓縮後的vmlinux和解壓縮程式組成,如下圖所示:

檢視 2410 的 datasheet ,發現記憶體對映的基址是 0x3000 0000 ,那麼0x30008000 又是如何來的呢?

在核心文件kernel/Document/arm/Booting 檔案中有:

Calling the kernel image

Existingboot loaders: MANDATORY 
New boot loaders: MANDATORY 
There are two options for calling the kernel zImage. If the zImage is stored inflash, and is linked correctly to be run 
from flash, then it is legal for the boot loader to call the zImage in flashdirectly. 
The zImage may also be placed in system RAM (at any location) and called there.Note that the kernel uses 16K of 
RAM below the image to store page tables. The recommended placement is 32KiBinto RAM. 
看來在image下面用了32K(0x8000)的空間存放核心頁表,

0x30008000 就是 2410 的核心在 RAM 中的啟動地址,這個地址就是這麼來的。

用U-Boot啟動Linux核心
1、下載uImage.bin到SDRAM的0x30008000處
tftp 0x30008000 uImage
2、啟動核心
bootm 0x30008000