比较zImage和uImage的区别
一、vmlinuz
vmlinuz是可引導(dǎo)的、壓縮的內(nèi)核?!皏m”代表“Virtual Memory”。Linux 支持虛擬內(nèi)存,不像老的操作系統(tǒng)比如DOS有640KB內(nèi)存的限制。Linux能夠使用硬盤空間作為虛擬內(nèi)存,因此得名“vm”。
vmlinuz的建立有兩種方式。一是編譯內(nèi)核時通過“make zImage”創(chuàng)建,然后通過:“cp /usr/src/linux-2.4/arch/i386/linux/boot/zImage/boot/vmlinuz”產(chǎn)生。zImage適用于小內(nèi)核的情況,它的存在是為了向后的兼容性。
二是內(nèi)核編譯時通過命令make bzImage創(chuàng)建,然后通過:“cp/usr/src/linux-2.4/arch/i386/linux/boot/bzImage /boot/vmlinuz”產(chǎn)生。bzImage是壓縮的內(nèi)核映像,需要注意,bzImage不是用bzip2壓縮的,bzImage中的bz容易引起誤解,bz表示“big zImage”。 bzImage中的b是“big”意思。 zImage(vmlinuz)和bzImage(vmlinuz)都是用gzip壓縮的。它們不僅是一個壓縮文件,而且在這兩個文件的開頭部分內(nèi)嵌有 gzip解壓縮代碼。所以你不能用gunzip 或 gzip –dc解包vmlinuz。?
二、initrd-x.x.x.img
initrd是“initial ramdisk”的簡寫。initrd一般被用來臨時的引導(dǎo)硬件到實際內(nèi)核vmlinuz能夠接管并繼續(xù)引導(dǎo)的狀態(tài)。
initrd映象文件是使用mkinitrd創(chuàng)建的。mkinitrd實用程序能夠創(chuàng)建initrd映象文件。這個命令是RedHat專有的。其它Linux發(fā)行版或許有相應(yīng)的命令。這是個很方便的實用程序。具體情況請看幫助:man mkinitrd下面的命令創(chuàng)建initrd映象文件。
?最后生成的內(nèi)核鏡象有兩種zImage以及uImage。其中zImage下載到目標(biāo)板中后,可以直接用uboot的命令go來進行直接跳轉(zhuǎn)。這時候內(nèi)核直接解壓啟動。但是無法掛載文件系統(tǒng),因為go命令沒有將內(nèi)核需要的相關(guān)的啟動參數(shù)傳遞給內(nèi)核。傳遞啟動參數(shù)我們必須使用命令bootm來進行跳轉(zhuǎn)。Bootm命令跳轉(zhuǎn)只處理uImage的鏡象。
uboot源代碼的tools/目錄下有mkimage工具,這個工具可以用來制作不壓縮或者壓縮的多種可啟動映象文件。
mkimage在制作映象文件的時候,是在原來的可執(zhí)行映象文件的前面加上一個0x40字節(jié)的頭,記錄參數(shù)所指定的信息,這樣uboot才能識別這個映象是針對哪個CPU體系結(jié)構(gòu)的,哪個OS的,哪種類型,加載內(nèi)存中的哪個位置, 入口點在內(nèi)存的那個位置以及映象名是什么
用法如下:
./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)
參數(shù)說明:
-A 指定CPU的體系結(jié)構(gòu):
取值 表示的體系結(jié)構(gòu)
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 指定操作系統(tǒng)類型,可以取以下值:
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 指定映象在內(nèi)存中的加載地址,映象下載到內(nèi)存中時,要按照用mkimage制作映象時,這個參數(shù)所指定的地址值來下載
?-e 指定映象運行的入口點地址,這個地址就是-a參數(shù)指定的值加上0x40(因為前面有個mkimage添加的0x40個字節(jié)的頭)
-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
內(nèi)核鏡象已經(jīng)準(zhǔn)備好了,這個時候我們就要來準(zhǔn)備文件系統(tǒng)了。由于時間緣故,本人暫時采用的是其他人已經(jīng)好的文件系統(tǒng)k9.img.gz。這個時候我們要做的是,自己寫一個簡單hello.c的程序,編譯通過后加入到該文件系統(tǒng)中,然后下載到目標(biāo)板中運行。
先編寫hello.c;
編譯:
#/usr/local/arm/2.95.3/bin/arm-linux-gcc ?–o start-hello hello.c
編譯后生成可執(zhí)行文件start-hello
下面我們就必須把該執(zhí)行文件加入到文件系統(tǒng)中去,步驟如下:
#gunzip ?k9.img.gz ? ? ? ? ? ? ? ? ? ? //解壓縮
#mount –o loop k9.img ?/mnt/new_disk ? ?//掛載
#cp start-hello ?/mnt/new_disk ? ? ? ? ? //將文件拷貝到文件系統(tǒng)中
#cd ?/mnt/new_disk
#umount /mnt/new_disk ? ? ? ? ? ? ? ? //卸載
#gzip –c –v9 k9.img > k9.img.gz ? ? ? ? ?//壓縮 生成最終的文件系統(tǒng)
下面我們就要下載內(nèi)核以及準(zhǔn)備好文件系統(tǒng)了,這邊先說明我的內(nèi)存分配情況如下:
Flash:
0x10000000 ――― 0x10020000 ? ? boot
0x10020000 ――― 0x10040000 ? ? uboot
0x10040000 ――― 0x10060000 ? ? uboot env
0x10060000 ――― 0x10200000 ? ? kernel
0x10200000 ――― 0x11000000 ? ? ramdisk
?
Sdram:
0x20007fc0 ――― 0x20a00000 ? ? kernel
0x20a00000 ――― ? ? ? ? ? ? ? ?ramdisk
?Loadb ?通過串口下載數(shù)據(jù)到ram中
cp.b ? ?拷貝ram中的數(shù)據(jù)到flash中。
?將kernel以及文件系統(tǒng)ramdisk下載完畢之后,我們還需要設(shè)置uboot的環(huán)境變量,這樣uboot才能夠在上電啟動的時候啟動內(nèi)核等操作。環(huán)境變量設(shè)置如下:
Set cpfltoram cp.b 10200000 20a00000 18ffff ? ? ? ? ? ?//拷貝文件系統(tǒng)到ram中
Set boot bootm 20007fc0 ? ? ? ? ? ? ? ? ? ? ? ? ? ?//啟動kernel
Set bootcmd run cpfltoker\;run cpfltoram\;run boot ? ? ? //uboot復(fù)位的執(zhí)行指令
?Set cpfltoker cp.b 10060000 20007fc0 f4fff ? ? ? ? ? ? //拷貝內(nèi)核到ram中
Set bootargs root=/dev/ram rw initrd=0x20a00000,4M init=/linuxrc console=ttyS0,11520
0,mem=32m ? ?//uboot傳遞給內(nèi)核的啟動參數(shù)
對于Linux內(nèi)核,編譯可以生成不同格式的映像文件,例如:
# make zImage
# make uImage
? ? zImage是ARM Linux常用的一種壓縮映像文件,uImage是U-boot專用的映像文件,它是在zImage之前加上一個長度為0x40的“頭”,說明這個映像文件的類型、加載位置、生成時間、大小等信息。換句話說,如果直接從uImage的0x40位置開始執(zhí)行,zImage和uImage沒有任何區(qū)別。另外,Linux2.4內(nèi)核不支持uImage,Linux2.6內(nèi)核加入了很多對嵌入式系統(tǒng)的支持,但是uImage的生成也需要設(shè)置。
vmlinux ?編譯出來的最原始的內(nèi)核文件,未壓縮。
zImage ? 是vmlinux經(jīng)過gzip壓縮后的文件。
bzImage bz表示“big zImage”,不是用bzip2壓縮的。兩者的不同之處在于,zImage解壓縮內(nèi)核到低端內(nèi)存(第一個640K),bzImage解壓縮內(nèi)核到高端內(nèi)存(1M以上)。如果內(nèi)核比較小,那么采用zImage或bzImage都行,如果比較大應(yīng)該用bzImage。
uImage ? U-boot專用的映像文件,它是在zImage之前加上一個長度為0x40的tag。
vmlinuz ?是bzImage/zImage文件的拷貝或指向bzImage/zImage的鏈接。
initrd ? 是“initial ramdisk”的簡寫。一般被用來臨時的引導(dǎo)硬件到實際內(nèi)核vmlinuz能夠接管并繼續(xù)引導(dǎo)的狀態(tài)。
vmlinux是內(nèi)核文件,
zImage是一般情況下默認的壓縮內(nèi)核映像文件,壓縮vmlinux,加上一段解壓啟動代碼得到,只能從0X0地址運行。
bzImage在uClinux中很少見到。
uImage是u-boot使用bootm命令引導(dǎo)的Linux壓縮內(nèi)核映像文件格式,
使用工具mkimage對普通的壓縮內(nèi)核映像文件(zImage)加工而得。可以由bootm命令從任意地址解壓啟動內(nèi)核。
由于bootloader一般要占用0X0地址,所以,uImage相比zImage的好處就是可以和bootloader共存。
制作uImage的mkimage軟件,如果uClinux-dist有的話,一般放在uClinux-dist的tools目錄中。
總結(jié)
以上是生活随笔為你收集整理的比较zImage和uImage的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 芝杜z1000pro硬盘播放器能下载超清
- 下一篇: 仙剑奇侠传三剧情介绍