uImage、zImage、bzImage、vlinzx區別

在網絡中,不少服務器採用的是Linux系統。爲了進一步提高服務器的性能,可能需要根 據特定的硬件及需求重新編譯Linux內核。編譯Linux 內核,需要根據規定的步驟進行,編譯內核過程中涉及到幾個重要的文件。比如對於RedHat Linux,在/boot目錄下有一些與Linux內核有關的文件 .
  編譯過RedHat Linux內核的人對其中的System.map、vmlinuz、initrd-2.4.7-10.img印象可能比較深刻,因爲編譯內核過程中涉及到這些文件的建立等操作。那麼這幾個文件是怎麼產生的?又有什麼作用呢?

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

# make zImage
# make uImage
# make bzImage

zImage是ARM Linux常用的一種壓縮映像文件不能超過512KB,bzImage 即bigzImage ,二者的內核都是gzip壓縮的
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是可執行 的Linux內核,它位於/boot/vmlinuz,它一般是一個軟鏈接,比如圖中是vmlinuz-2.4.7-10的軟鏈接。

vmlinuz的建立有兩種方式。

一是編譯內核時通過“make zImage”創建,手動拷貝到/boot目錄下面。zImage適用於小內核的情況,它的存在是爲了向後的兼容性。

  二是內核編譯時通過命令make bzImage創建,然後手動拷貝至/boot目錄下。bzImage是壓縮的內核映像,需要注意,bzImage不是用bzip2壓縮的,bz表示“big zImage”。 bzImage中的b是“big”意思。 zImage(vmlinuz)和bzImage(vmlinuz)都是用gzip壓縮的。它們不僅是一個壓縮文件,而且在這兩個文件的開頭部分內嵌有gzip解壓縮代碼。所以你不能用gunzip或gzip –dc解包vmlinuz。

內核文件中包含一個微型的gzip用於解壓縮內核並引導它。兩者的不同之處在於,老的zImage解壓縮內核到低端內存(第一個 640K),bzImage解壓縮內核到高端內存(1M以上)。如果內核比較小,那麼可以採用zImage或bzImage之一,兩種方式引導的系統運行 時是相同的。大的內核採用bzImage,不能採用zImage。

vmlinux是未壓縮的內核,vmlinuz是vmlinux的壓縮文件。

  二、initrd-x.x.x.img

  initrd是“initial ramdisk”的簡寫。initrd一般被用來臨時的引導硬件到實際內核vmlinuz能夠接管並繼續引導的狀態。圖中的initrd-2.4.7-10.img主要是用於加載ext3等文件系統及scsi設備的驅動。

  比如,使用的是scsi硬盤,而內核vmlinuz中並沒有這個scsi硬件的驅動,scsi模塊是存儲在根文件系統的/lib/modules下的,那麼在裝入scsi模塊之前,內核不能加載根文件系統。爲了解決這個問題,可以引導一個能夠讀實際內核的initrd內核並用initrd修正 scsi引導問題。initrd-2.4.7-10.img是用gzip壓縮的文件,initrd實現加載一些模塊和安裝文件系統等功能。

initrd映象文件是使用mkinitrd創建的。mkinitrd實用程序能夠創建initrd映象文件。這個命令是RedHat專有的(這也是爲什麼,在Linux內核包裏/Documentation/Changes裏面沒有提到要將mkinitrd升級)。其它Linux發行版或許有相應的命令。這是個很方便的實用程序。具體情況請看幫助:man mkinitrd下面的命令創建initrd映象文件。

initrd映象文件是使用mkinitrd創建的。mkinitrd實用程序能夠創建initrd映象文件。這個命令是RedHat專有的。其它Linux發行版或許有相應的命令。這是個很方便的實用程序。具體情況請看幫助:man mkinitrd下面的命令創建initrd映象文件。

  三、uImage文件

vmlinux是內核文件,zImage是一般情況下默認的壓縮內核映像文件,壓縮vmlinux,加上一段解壓啓動代碼得到。而uImage是u-boot使用bootm命令引導的Linux壓縮內核映像文件格式,是使用工具mkimage對普通的壓縮內核映像文件(zImage)加工而得。它是uboot專用的映像文件,它是在zImage之前加上一個長度爲 64字節的“頭”,說明這個內核的版本、加載位置、生成時間、大小等信息;其0x40之後與zImage沒區別。

由於bootloader一般要佔用0X0地址,所以,uImage相比zImage的好處就是可以和bootloader共存。

其實就是一個自動跟手動的區別,有了uImage頭部的描述,u-boot就知道對應Image的信息,如果沒有頭部則需要自己手動去搞那些參數。

如何生成uImage文件?首先 在uboot的/tools目錄下尋找mkimage文件,把其copy到系統/usr/local/bin目錄下,這樣就完成製作工具。然後在內核目錄下運行make uImage,如果成功,便可以在arch/arm/boot/目錄下發現uImage文件,其大小比zImage多64個字節。

此外,平時調試用uImage,不用去管調整了哪些東西;zImage則是一切OK後直接燒0X0。開機就運行。

發佈了6 篇原創文章 · 獲贊 6 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章