對於linux核心,編譯可以生成不同格式的映像檔案,例如:
# make zimage
# make uimage
zimage是arm linux常用的一種壓縮映像檔案,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 的建立有兩種方式。一是編譯核心時通過「make zimage」建立,然後通過:「cp /usr/src/linux-2.4/arch/i386/linux/boot/zimage/boot/vmlinuz」產生。zimage適用於 小核心的情況,它的存在是為了向後的相容性。
二 是核心編譯時通過命令make bzimage建立,然後通過:「cp/usr/src/linux-2.4/arch/i386/linux/boot/bzimage /boot/vmlinuz」產生。bzimage是壓縮的核心映像,需要注意,bzimage不是用bzip2壓縮的,bzimage中的bz容易引起 誤解,bz表示「big zimage」。 bzimage中的b是「big」意思。 zimage(vmlinuz)和bzimage(vmlinuz)都是用gzip壓縮的。它們不僅是乙個壓縮檔案,而且在這兩個檔案的開頭部分內嵌有 gzip解壓縮**。所以你不能用gunzip 或 gzip –dc解包vmlinuz。
二、initrd-x.x.x.img
initrd是「initial ramdisk」的簡寫。initrd一般被用來臨時的引導硬體到實際核心vmlinuz能夠接管並繼續引導的狀態。
initrd 映象檔案是使用mkinitrd建立的。mkinitrd實用程式能夠建立initrd映象檔案。這個命令是redhat專有的。其它linux發行版或 許有相應的命令。這是個很方便的實用程式。具體情況請看幫助:man mkinitrd下面的命令建立initrd映象檔案。
最後生成的核心鏡象有兩種
zimage
以及uimage
。其中zimage
uboot
的命令go 來進行直接跳轉。這時候核心直接解壓啟動。但是無法掛載檔案系統,因為
go 命令沒有將核心需要的相關的啟動引數傳遞給核心。傳遞啟動引數我們必須使用命令
bootm
來進行跳轉。
bootm
命令跳轉只處理
uimage
的鏡象。
uboot
源**的
tools/
目錄下有
mkimage
工具,這個工具可以用來製作不壓縮或者壓縮的多種可啟動映象檔案。
mkimage
在製作映象檔案的時候,是在原來的可執行映象檔案的前面加上乙個
0x40
位元組的頭,記錄引數所指定的資訊,這樣
uboot
才能識別這個映象是針對哪個
cpu 體系結構的,哪個
os 的,哪種型別,載入記憶體中的哪個位置,
入口點在記憶體的那個位置以及映象名是什麼
用法如下:
./mkimage -a arch -o os -t type -c comp -a addr -e ep -n name -d data_file[:data_file...] image
-a ==> set architecture to 'arch'
-o ==> set operating system to 'os'
-t ==> set image type to 'type'
-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)
引數說明:
-a 指定
cpu 的體系結構:
取值表示的體系結構
alpha alpha
arm a rm
x86 intel x86
ia64 ia64
mips mips
mips64 mips 64 bit
ppc powerpc
s390 ibm s390
sh superh
sparc sparc
sparc64 sparc 64 bit
m68k mc68000
-o 指定作業系統型別,可以取以下值:
openbsd
、netbsd
、freebsd
、4_4bsd
、linux
、svr4
、esix
、solaris
、irix
、sco
、dell
、ncr
、lynxos
、vxworks
、psos
、qnx
、u-boot
、rtems
、artos
-t 指定映象型別,可以取以下值:
standalone
、kernel
、ramdisk
、multi
、firmware
、script
、filesystem
-c 指定映象壓縮方式,可以取以下值:
none
不壓縮gzip
用gzip
的壓縮方式
bzip2
用bzip2
的壓縮方式
-a mkimage
-e 指定映象執行的入口點位址,這個位址就是
-a 引數指定的值加上
0x40
(因為前面有個
mkimage
新增的0x40
個位元組的頭)
-n 指定映象名
-d 指定製作映象的原始檔
我在編譯時用到的命令如下:
# make zimage //
生成zimage
鏡象 #/usr/local/arm/k9uboot/tools/
mkimage -n 'linux 2.4.27' -a arm -o linux -t
kernel -c none -a 0x20007fc0 -e 0x20008000 -d zimage
uimage
uImage與zImage的區別
核心編譯 make 之後會生成兩個檔案,乙個image,乙個zimage,其中image為核心映像檔案,而zimage為核心的一種映像壓縮檔案,image大約為4m,而zimage不到2m。那麼uimage又是什麼的?它是uboot專用的映像檔案,它是在zimage之前加上乙個長度為64位元組的 頭...
zImage與uImage的區別
在編譯linux核心時,通常都是生成zimage,它是一般情況下預設的壓縮核心映像檔案。而實際上,zimage是通過壓縮核心檔案vmlinux後,再加上一段解壓啟動 得到。而uimage是u boot使用bootm命令引導的linux壓縮核心映像檔案格式,是使用工具mkimage對普通的壓縮核心映像...
uImage和zImage的區別
zimage是arm linux常用的一種壓縮映像檔案,uimage是u boot專用的映像檔案,它是在zimage之前加上乙個長度為0x40的 頭 說明這個映像檔案的型別 載入位置 生成時間 大小等資訊。換句話說,如果直接從uimage的0x40位置開始執行,zimage和uimage沒有任何區別...