zImage與uImage的區別

2021-05-25 08:34:47 字數 3574 閱讀 7332

對於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沒有任何區別...