編譯過RedHat Linux內核的人對其中的System.map、vmlinuz、initrd-2.4.7-10.img印象可能比較深刻,因為編譯內核過程中涉及到這些文件的建立等操作。那么這幾個文件是怎么產生的?又有什么作用呢?本文對此做些介紹。
一、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壓縮 的,bzImage中的bz容易引起誤解,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模塊之前,內核不能加載根文件系統,但 scsi模塊存儲在根文件系統的/lib/modules下。為了解決這個問題,可以引導一個能夠讀實際內核的initrd內核並用initrd修正 scsi引導問題。initrd-2.4.7-10.img是用gzip壓縮的文件,initrd實現加載一些模塊和安裝文件系統等功能。
initrd映象文件是使用mkinitrd創建的。mkinitrd實用程序能夠創建initrd映象文件。這個命令是RedHat專有的(這也是為什么,在Linux內核包里/Documentation/Changes里面沒有提到要將mkinitrd升級)。其它Linux發行版或許有相應的命令。這是個很方便的實用程序。具體情況請看幫助:man mkinitrd下面的命令創建initrd映象文件。
三、uImage文件
vmlinux是內核文件,zImage是一般情況下默認的壓縮內核映像文件,壓縮vmlinux,加上一段解壓啟動代碼得到。而uImage 則是使用工具mkimage對普通的壓縮內核映像文件(zImage)加工而得。它是uboot專用的映像文件,它是在zImage之前加上一個長度為 64字節的“頭”,說明這個內核的版本、加載位置、生成時間、大小等信息;其0x40之后與zImage沒區別。
其實就是一個自動跟手動的區別,有了uImage頭部的描述,u-boot就知道對應Image的信息,如果沒有頭部則需要自己手動去搞那些參數。
如何生成 uImage文件?首先在uboot的/tools目錄下尋找mkimage文件,把其copy到系統/usr/local/bin目錄下,這樣就完成制 作工具。然后在內核目錄下運行make uImage,如果成功,便可以在arch/arm/boot/目錄下發現uImage文件,其大小比 zImage多64個字節。
此外,平時調試用uImage,不用去管調整了哪些東西;zImage則是一切OK后直接燒0X0。開機就運行。
