vmlinux 相關知識錦集

 

原文出處:

http://www.360doc.com/content/10/1228/08/496343_81916311.shtmlhtml

 

 


vmlinux, zImage, Image的區別 

從下面的內核編譯過程,能夠看出vmlinux, arch/arm/boot/compressed/vmlinux, arch/arm/boot/Image, arch/arm/boot/zImage 之間的區別
 
  LD      vmlinux
  SYSMAP  System.map
  SYSMAP  .tmp_System.map
  OBJCOPY arch/arm/boot/Image
  Kernel: arch/arm/boot/Image is ready
  AS      arch/arm/boot/compressed/head.o
  GZIP    arch/arm/boot/compressed/piggy.gz
  AS      arch/arm/boot/compressed/piggy.o
  CC      arch/arm/boot/compressed/misc.o
  AS      arch/arm/boot/compressed/head-xscale.o
  LD      arch/arm/boot/compressed/vmlinux
  OBJCOPY arch/arm/boot/zImagelinux

vmlinux 是一個elf格式的文件
Image 是通過objcopy 處理了的只包含內核代碼,數據的一個文件, 已經不是elf格式的了。此時尚未通過壓縮
arch/arm/boot/compressed/vmlinux 是通過壓縮的Image和加入瞭解壓頭的elf格式的文件
arch/arm/boot/zImage 是通過objcopy處理了的能夠直接下到對應的地址執行的內核鏡像服務器

objcopy:網絡

GNU 實用工具程序objcopy的做用是拷貝一個目標文件的內容到另外一個目標文件中。Objcopy使用GNUBFD庫去讀或寫目標文件。Objcopy能夠 使用不一樣於源目標文件的格式來寫目的目標文件(也便是說能夠將一種格式的目標文件轉換成另外一種格式的目標文件)。經過以上命令行選項能夠控制 Objcopy的具體操做。ide

Objcopy在進行目標文件的轉換時,將生成一個臨時 文件,轉換完成後就將這個臨時文件刪掉。Objcopy使用BFD作轉換工做。若是沒有明確地格式要求,則Objcopy將訪問全部在BFD庫中已經描述 了的而且它能夠識別的格式,請參見《GNUpro Decelopment Tools》中「using ld」一章中「BFD庫」部分和「BFD庫中規範的目標文件格式」部分。工具

經過使用srec做爲輸出目標(使用命令行選項-o srec),Objcopy能夠產生S記錄格式文件。post

通 過使用binary做爲輸出目標(使用命令行選項-obinary),Objcopy能夠產生原始的二進制文件。使用Objcopy產生一個原始的二進制 文件,實質上是進行了一回輸入目標文件內容的內存轉儲。全部的符號和重定位信息都將被丟棄。內存轉儲起始於輸入目標文件中那些將要拷貝到輸出目標文件去的 部分的最小虛地址處。性能

使用Objcopy生成S記錄格式文件或者原始的二進制文件的過程當中,-S選項和-R選項可能會比較有用。-S選項是用來刪掉包含調試信息的部分,-R選項是用來刪掉包含了二進制文件不須要的內容的那些部分。ui

 

vmlinux,vmlinuz,uImage,zImage,bzImage之間的異同  spa

在 網絡中,很多服務器採用的是Linux系統。爲了進一步提升服務器的性能,可能須要根據特定的硬件及需求從新編譯Linux內核。編譯Linux 內核,須要根據規定的步驟進行,編譯內核過程當中涉及到幾個重要的文件。好比對於RedHatLinux,在/boot目錄下有一些與Linux內核有關的 文件,進入/boot執行。
編譯過RedHat Linux內核的人對其中的System.map、vmlinuz、initrd-2.4.7-10.img印象可能比較深入,由於編譯內核過程當中涉及到這些文件的創建等操做。那麼這幾個文件是怎麼產生的?又有什麼做用呢?本文對此作些介紹。
  1、vmlinuz
  vmlinuz是可引導的、壓縮的內核 。「vm」表明「Virtual Memory」。Linux 支持虛擬內存,不像老的操做系統好比DOS有640KB內存的限制。Linux可以使用硬盤空間做爲虛擬內存,所以得名「vm」。vmlinuz是可執行 的Linux內核,它位於/boot/vmlinuz,它通常是一個軟連接,好比圖中是vmlinuz-2.4.7-10的軟連接。
  vmlinuz的創建有兩種方式。一是編譯內核時經過「make zImage」建立,手動拷貝到/boot目錄下面。zImage適用於小內核的狀況,它的存在是爲了向後的兼容性。
   二是內核編譯時經過命令makebzImage建立,而後手動拷貝至/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的壓縮文件。
  2、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映象文件。
   3、uImage文件
   vmlinux是內核文件,zImage是通常狀況下默認的壓縮內核映像文件,壓縮vmlinux,加上一段解壓啓動代碼獲得。而uImage則是使用 工具mkp_w_picpath對普通的壓縮內核映像文件(zImage)加工而得。它是uboot專用的映像文件,它是在zImage以前加上一個長度爲64字節的 「頭」,說明這個內核的版本、加載位置、生成時間、大小等信息; 其0x40以後與zImage沒區別。  
其實就是一個自動跟手動的區別,有了uImage頭部的描述,u-boot就知道對應Image的信息,若是沒有頭部則須要本身手動去搞那些參數。
如 何生成uImage文件?首先在uboot的/tools目錄下尋找mkp_w_picpath文件,把其copy到系統/usr/local/bin目錄下,這樣就 完成製做工具。而後在內核目錄下運行make uImage,若是成功,即可以在arch/arm/boot/目錄下發現uImage文件,其大小比 zImage多64個字節。

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

 

 

在make install發生的事

在make install後, 會有三個文件被放到/boot下:
1. vmlinuz-2.6.x.y.z
2. System.map
3. config
4. 爲何個人gentoo沒有initrd.img的??
在/usr/src/linux下還有一個vmlinux的方件.

 

那麼/boot下的vmlinux是哪一個呢? 以下:

jessinio@niolaptop /usr/src/linux $ diff /usr/src/linux/arch/x86/boot/bzImage /usr/src/linux/vmlinux
Files /usr/src/linux/arch/x86/boot/bzImage and /usr/src/linux/vmlinux differ
jessinio@niolaptop /usr/src/linux $ diff /usr/src/linux/arch/x86/boot/bzImage /boot/vmlinuz

能夠看出/boot下的vmlinux是/usr/src/linux/arch/x86/boot/bzImage


隨便提一下make內核時的過程:

就常使用的make也過程:
cd /usr/src/linux
make menuconfig
make
make modules_install
make install

注意到上面的一個make是不參數的, 這種狀況實際以下:
Execute "make" or "make all" to build all targets marked with [*]

"*"號等於以下:
make vlinux modules bzImage

 

zImage / vmlinux / Image生成的流程圖

  SRC_TREE    :=./
HEADER_PATH    :=arch/arm/boot/compressed
BOOT_PATH    :=arch/arm/boot/
KERNEL_PATH    :=arch/arm/kernel

 


-----------------------------------------------------------------------------------------------------------------------

1 SRC_TREE 目錄下的vmlinux通過objcoy後生成二進制文件Image,Image在通過gzip壓縮後生成piggy.o
   piggy.o是真正的內核鏡像文件

2 HEADER_PATH/head.o ,head-xscal.o ,misc.o 的做用就是把piggy.o解壓到指定的位置,而後執行piggy.o解壓後的代碼


HEADER_PATH/zImage
       ^
       |[objcopy]
       |
HEADER_PATH/vmlinux
       ^
       |[ld]
       |
       +-<--HEADER_PATH/head.o
       |
       +-<--HEADER_PATH/head-xscal.o
       |
       +-<--HEADER_PATH/misc.o
       |
       +-<--HEADER_PATH/piggy.o <-- HEADER_PATH/piggy.gz <--[gzip]-- BOOT_PATH/Image <--[objcopy]--SRC_TREE/vmlinux

-----------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------

SRC_TREE目錄下的vmlinux是由一下三部分組成的:

$(vmlinux-init)

$(vmlinux-main)

kallsyms.o

vmlinux    ^    |    +-<--$(vmlinux-init)    |          ^    |          |    |          +--<--KERNEL_PATH/head.S    |          |    |          +--<--KERNEL_PATH/init_task.o    |          |    |          +--<--SRC_TREE/init/build-in.o    |            +--< $(vmlinux-main)    |          ^    |          |$(cory-y)    |          +--<--SRC_TREE/driver/built-in.o    |          |    |          +--<--SRC_TREE/mm/built-in.o    |          |    |          +--<--SRC_TREE/usr/built-in.o    |          |    |          +--<--SRC_TREE/kernel/built-in.o    |          |    |          +--<--SRC_TREE/mm/built-in.o    |          |    |          +--<--SRC_TREE/fs/built-in.o    |          |    |          +--<--SRC_TREE/ipc/built-in.o    |          |    |          +--<--SRC_TREE/securiy/built-in.o    |          |    |          +--<--SRC_TREE/crypto/built-in.o    |          |    |          +--<--SRC_TREE/block/built-in.o    |          |    |          +--<--arch/arm/kernel/built-in.o    |          |    |          +--<--arch/arm/mm/built-in.o    |          |    |          +--<--arch/arm/common/built-in.o    |          |    |          +--<--arch/arm/mach-pxa/built-in.o    |          |    |          +--<--arch/arm/nwfpe/buit-in.o    |          |    |          |$(lib-y)    |          +--<--SRC_TREE/lib/built-in.o    |          |    |          +--<--arch/arm/lib/built-in.o    |          |    |          |$(drivers-y)    |          +--<--SRC_TREE/drivers/buit-in.o    |          |    |          +--<--SRC_TREE/sound/buit-in.o    |          |    |          |$(net-y)    |          +--<--SRC_TREE/net/buit-in.o    |    +--< kallsyms.o

相關文章
相關標籤/搜索