zImage和uImage的區別

2022-04-01 16:17:46 字數 4847 閱讀 2576

一、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映象檔案。

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的壓縮方式

-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

先編寫hello.c;

編譯:#/usr/local/arm/2.95.3/bin/arm-linux-gcc  –o start-hello hello.c

編譯後生成可執行檔案start-hello

下面我們就必須把該執行檔案加入到檔案系統中去,步驟如下:

#gunzip  k9.img.gz                     //解壓縮

#mount –o loop k9.img  /mnt/new_disk    //掛載

#cp start-hello  /mnt/new_disk           //將檔案拷貝到檔案系統中

#cd  /mnt/new_disk

#umount /mnt/new_disk                 //解除安裝

#gzip –c –v9 k9.img > k9.img.gz          //壓縮 生成最終的檔案系統

flash:

0x10000000 ――― 0x10020000     boot

0x10020000 ――― 0x10040000     uboot

0x10040000 ――― 0x10060000     uboot env

0x10060000 ――― 0x10200000     kernel

0x10200000 ――― 0x11000000     ramdisk

sdram:

0x20007fc0 ――― 0x20a00000     kernel

0x20a00000 ―――                ramdisk

cp.b    拷貝ram中的資料到flash中。

set cpfltoram cp.b 10200000 20a00000 18ffff            //拷貝檔案系統到ram中

set boot bootm 20007fc0                            //啟動kernel

set bootcmd run cpfltoker\;run cpfltoram\;run boot       //uboot復位的執行指令

set cpfltoker cp.b 10060000 20007fc0 f4fff             //拷貝核心到ram中

set bootargs root=/dev/ram rw initrd=0x20a00000,4m init=/linuxrc console=ttys0,11520

0,mem=32m    //uboot傳遞給核心的啟動引數

對於linux核心,編譯可以生成不同格式的映像檔案,例如:

# make zimage

# make uimage

zimage是arm linux常用的一種壓縮映像檔案,uimage是u-boot專用的映像檔案,它是在zimage之前加上乙個長度為0x40的「頭」,說明這個映像檔案的型別、載入位置、生成時間、大小等資訊。換句話說,如果直接從uimage的0x40位置開始執行,zimage和uimage沒有任何區別。另外,linux2.4核心不支援uimage,linux2.6核心加入了很多對嵌入式系統的支援,但是uimage的生成也需要設定。

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

zimage   是vmlinux經過gzip壓縮後的檔案。

bzimage bz表示「big zimage」,不是用bzip2壓縮的。兩者的不同之處在於,zimage解壓縮核心到低端記憶體(第乙個640k),bzimage解壓縮核心到高階記憶體(1m以上)。如果核心比較小,那麼採用zimage或bzimage都行,如果比較大應該用bzimage。

uimage   u-boot專用的映像檔案,它是在zimage之前加上乙個長度為0x40的tag。

vmlinuz  是bzimage/zimage檔案的拷貝或指向bzimage/zimage的鏈結。

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

vmlinux是核心檔案,

zimage是一般情況下預設的壓縮核心映像檔案,壓縮vmlinux,加上一段解壓啟動**得到,只能從0x0位址執行。

bzimage在uclinux中很少見到。

uimage是u-boot使用bootm命令引導的linux壓縮核心映像檔案格式,

使用工具mkimage對普通的壓縮核心映像檔案(zimage)加工而得。可以由bootm命令從任意位址解壓啟動核心。

由於bootloader一般要占用0x0位址,所以,uimage相比zimage的好處就是可以和bootloader共存。

製作uimage的mkimage軟體,如果uclinux-dist有的話,一般放在uclinux-dist的tools目錄中。

uImage和zImage的區別

zimage是arm linux常用的一種壓縮映像檔案,uimage是u boot專用的映像檔案,它是在zimage之前加上乙個長度為0x40的 頭 說明這個映像檔案的型別 載入位置 生成時間 大小等資訊。換句話說,如果直接從uimage的0x40位置開始執行,zimage和uimage沒有任何區別...

zImage和UImage的區別

1 核心編譯 make 之後會生成兩個檔案,乙個image,乙個zimage,其中image為核心映像檔案,而zimage為核心的一種映像壓縮檔案,image大約為4m,而zimage不到2m。那麼uimage又是什麼的?它是uboot專用的映像檔案,它是在zimage之前加上乙個長度為64位元組的...

zImage和uImage的區別聯絡

注 本文是學習朱老師課程整理的筆記,基於linux2.6.35.7和九鼎x210bv3s開發板進行移植。linux核心經過編譯後會生成乙個elf格式的可執行程式,叫vmlinux或vmlinuz,這個就是原始的未經任何處理加工的原版核心elf檔案 嵌入式系統部署時刻錄的一般不是這個vmlinuz v...