幾種linux內核文件的區別(vmlinux、zImage、bzImage、uImage、vmlinuz、initrd )


對於Linux內核,編譯可以生成不同格式的映像文件,例如:
# make zImage
# make uImage

   zImage是ARM Linux常用的一種壓縮映像文件,uImage是U-boot專用的映像文件,它是在zImage之前加上一個長度為0x40的“頭”,說明這個映像文件的類型、加載位置、生成時間、大小等信息。換句話說,如果直接從uImage的0x40位置開始執行,zImage和uImage沒有任何區別。另外,Linux2.4內核不支持uImage,Linux2.6內核加入了很多對嵌入式系統的支持,但是uImage的生成也需要設置。

 

 

幾種linux內核文件的區別:

1、vmlinux  編譯出來的最原始的內核文件,未壓縮。

2、zImage   是vmlinux經過gzip壓縮后的文件。

3、bzImage bz表示“big zImage”,不是用bzip2壓縮的。兩者的不同之處在於,zImage解壓縮內核到低端內存(第一個640K),bzImage解壓縮內核到高端內存(1M以上)。如果內核比較小,那么采用zImage或bzImage都行,如果比較大應該用bzImage。

4、uImage   U-boot專用的映像文件,它是在zImage之前加上一個長度為0x40的tag。

5、vmlinuz  是bzImage/zImage文件的拷貝或指向bzImage/zImage的鏈接。

6、initrd   是“initial ramdisk”的簡寫。一般被用來臨時的引導硬件到實際內核vmlinuz能夠接管並繼續引導的狀態。

 

 

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM