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