zImage轉換為uImage

來源:互聯網
上載者:User

標籤:blog   http   os   檔案   io   art   

寫個隨筆,備忘!

拿到一個核心後,首先將其make為zImage,步驟:

  1、將與要移植的系統的設定檔拷貝給.config

    cp xxx_xxx .config

  2、修改Makefile,指定平台構架和交叉編譯環境

    vim Makefile  ARCH  ?=XXX

            CROSS_COMPILE ?=xxxx

  3、啟動配置介面,定製核心

    make nemuconfig

  4、make zImage,

核心編譯(make)之後會產生兩個檔案,一個Image,一個zImage,其中Image為核心映像檔案,而zImage為核心的一種映像壓縮檔,Image大約為4M,而zImage不到2M。

那麼uImage又是什麼的?它是uboot專用的映像檔案,它是在zImage之前加上一個長度為64位元組的“頭”,說明這個核心的版本、載入位置、產生時間、大小等資訊;其0x40之後與zImage沒區別。

為讓我們的uboot方便識別並引導核心,需要交核心製作為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;

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是經過壓縮而得到的,所以其自身就有解壓縮代碼。

 

參考博文:http://blog.csdn.net/sailor_8318/article/details/2773412


原文http://blog.sina.com.cn/pengarmy

 

(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的產生也需要設定。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.