一、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...