歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> vmlinux,vmlinuz,uImage,zImage,bzImage之間的異同

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

日期:2017/2/27 16:02:16   编辑:Linux教程
linux內核鏡像格式
一、Linux內核鏡像格式
Linux內核有多種格式的鏡像,包括vmlinux、Image、zImage、bzImage、uImage、xipImage、bootpImage等.
(1)kernel鏡像格式:vmlinux
vmlinuz是可引導的、可壓縮的內核鏡像,vm代表Virtual Memory.Linux支持虛擬內存,因此得名vm.它是由用戶對內核源碼編譯得到,實質是elf格式的文件.也就是說,vmlinux是編譯出來的最原始的內核文件,未壓縮.這種格式的鏡像文件多存放在PC機上.
【 attention】elf格式文件
ELF,Executable and Linkable Format,可執行可鏈接格式,是UNIX實驗室作為應用程序二進制接口而發布的,擴展名為elf.可以簡單的認為,在elf格式的文件中,除二進制代 碼外,還包括該可執行文件的某些信息,比如符號表等.

(2)kernel鏡像格式:Image
Image是經過objcopy處理的只包含二進制數據的內核代碼,它已經不是elf格式了,但這種格式的內核鏡像還沒有經過壓縮.
【 attention】objcopy
GNU使用工具程序objcopy作用是拷貝一個目標文件的內容到另一個目標文件中,也就是說,可以將一種格式的目標文件轉換成另一種格式的目標文件. 通過使用binary作為輸出目標(-o binary),可產生一個原始的二進制文件,實質上是將所有的符號和重定位信息都將被拋棄,只剩下二進制數據.

(3)kernel鏡像格式:zImage
zImage是ARM linux常用的一種壓縮鏡像文件,它是由vmlinux加上解壓代碼經gzip壓縮而成,命令格式是#make zImage.這種格式的Linux鏡像文件多存放在NAND上.

(4)kernel鏡像格式:bzImage
bz表示big zImage,其格式與zImage類似,但采用了不同的壓縮算法,注意,bzImage的壓縮率更高.

(5)kernel鏡像格式:uImage
uImage是uboot專用的鏡像文件,它是在zImage之前加上一個長度為0x40的頭信息(tag),在頭信息內說明了該鏡像文件的類型、加載 位置、生成時間、大小等信息.換句話說,若直接從uImage的0x40位置開始執行,則zImage和uImage沒有任何區別.命令格式是#make uImage.這種格式的Linux鏡像文件多存放在NAND上.

(6)kernel鏡像格式:xipImage
這種格式的Linux鏡像文件多存放在NorFlash上,且運行時不需要拷貝到內存SDRAM中,可以直接在NorFlash中運行.

二、Linux內核鏡像的產生過程
在嵌入式Linux中,內核的啟動過程分為兩個階段.其中,第一階段啟動代碼放在arch/arm/kernel/head.S文件中,該文件與體系 結果相關,與用戶的開發板無關,主要是初始化ARM內核等.第二階段啟動代碼是init目錄下的main.c.現以執行命令#make zImage為例來說明,arm-linux內核鏡像的產生過程.
(1)當用戶對Linux內核源碼進行編譯時,kernel的第1/2階段代碼會生成可執行文件vmlinux,該文件是未被壓縮的鏡像文件,非常大,不能直接下載到NAND中,通常放在PC機上,這也是最原始的Linux鏡像文件.試驗時該文件約50M.

(2)鏡像文件vmlinux由於很大,肯定不能直接燒入NAND中,因此需要進行二進制化,即經過objcopy處理,使之只包含二進制數據的內核代 碼,去除不需要的文件信息等,這樣就制作成了image鏡像文件.該鏡像文件也是未壓縮,只是經過了二進制化而變小.試驗時該文件約5M.

(3) 一般來說,內存SDRAM中的內核鏡像是經過壓縮的,只是在運行時再將其解壓.所以,編譯時會先使用gzip將鏡像文件image進行壓縮(壓縮比約為 2:1),再將壓縮後的鏡像文件和源碼中的兩個文件arch/arm/boot/compressed/head.S、arch/arm/boot /compressed/misc.c一起鏈接生成壓縮後的鏡像文件compress/vmlinux.試驗時該文件約為2.5M.注意,這兩個源碼文件 是解壓程序,用於將內存SDRAM中的壓縮鏡像zImage進行解壓.

(4)壓縮後的鏡像文件compress/vmlinux經過二進制化,最終生成鏡像文件zImage,試驗時該文件約為2.5M.當然,在內存 SDRAM中運行壓縮鏡像文件zImage時,會首先調用兩個解壓程序arch/arm /boot/compressed/head.S、arch/arm/boot/compressed/misc.c將自身解壓,然後再執行kernel 的第一階段啟動代碼arch/arm/kernel/head.S.簡而言之,在內存中運行內核時,kernel先自身解壓,再執行第一階段啟動代碼.試 驗時運行在內存中的鏡像文件約為5M,與image鏡像文件大小相同.
【 attention】
(1) 網站:http://lxr.linux.no/
該網站通過了Linux內核源碼,不用解壓,在線查詢,非常方便.

(2)生成的鏡像文件vmlinux放在源碼的頂層目錄下.

(3)生成的鏡像文件image、zImage均在arch/arm/boot目錄下.

(4)啟動開發板時,在超級終端內會有許多的提示信息,其中:
booting linux ... /*表示正在將內核從NAND拷貝到內存中*/
unpressed... /*表示正在解壓內核*/
(5)只有當用戶輸入boot命令或在boot_delay延時時間後,vivi才將NANDFlash中的內核kernel拷貝到內存SDRAM中.也就是說,當vivi進入命令行模式時,在SDRAM中並沒有內核kernel.

(6)在kernel源碼目錄下執行命令:
<1> #tree /*打印出kernel源碼的目錄結構*/
<2> #tree -L 1 /*打印出kernel源碼的第一級目錄結構*/
<3> #tree > /home/lishuai/linux.txt /*將kernel源碼的目錄結構重定向到某個文件中,用戶可以隨時查看其目錄結構,非常方便*/

如何生成 uImage文件?首先在uboot的/tools目錄下尋找mkimage文件,把其copy到系統/usr/local/bin目錄下,這樣就完成制 作工具。然後在內核目錄下運行make uImage,如果成功,便可以在arch/arm/boot/目錄下發現uImage文件,其大小比 zImage多64個字節。
此外,平時調試用uImage,不用去管調整了哪些東西;zImage則是一切OK後直接燒0X0。開機就運行。
Copyright © Linux教程網 All Rights Reserved