天天看點

Linux核心鏡像格式Linux核心鏡像格式<Linux核心鏡像的産生過程><wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">

Linux核心鏡像格式

<Linux核心鏡像格式>

  Linux核心有多種格式的鏡像,包括vmlinux、Image、zImage、bzImage、uImage、xipImage、bootpImage等.

➤kernel鏡像格式vmlinux

  vmlinux是可引導的、未壓縮、可壓縮的核心鏡像,vm代表Virtual Memory。(表示Linux支援虛拟記憶體,是以得名vm)它是由使用者對核心源碼編譯得到,實質是elf格式的檔案.也就是說vmlinux是編譯出來的最原始的核心檔案,未壓縮.這種格式的鏡像檔案多存放在PC機上.

Linux核心鏡像格式Linux核心鏡像格式&lt;Linux核心鏡像的産生過程&gt;&lt;wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;"&gt;

☢elf格式檔案 :

  ELF(Executable and Linkable Format)可執行可連結格式,是UNIX實驗室作為應用程式二進制接口而釋出的,擴充名為elf.可以簡單的認為,在elf格式的檔案中,除二進制代 碼外,還包括該可執行檔案的某些資訊,比如符号表等。

  vmlinuz 是可執行 的Linux核心,它位于/boot/vmlinuz,它一般是一個軟連結,比如是 vmlinuz-3.13.0-32-generic 的軟連結。vmlinuz是vmlinux的壓縮檔案。vmlinuz的建立有兩種方式。一是編譯核心時通過“make zImage”建立,二是核心編譯時通過指令make bzImage建立。

➤kernel鏡像格式:Image

  Image是經過objcopy處理的隻包含二進制資料的核心代碼,它已經不是elf格式了,但這種格式的核心鏡像還沒有經過壓縮.

☢objcopy:

  GNU使用工具程式objcopy作用是拷貝一個目标檔案的内容到另一個目标檔案中,也就是說,可以将一種格式的目标檔案轉換成另一種格式的目标檔案. 通過使用binary作為輸出目标(-o binary),可産生一個原始的二進制檔案,實質上是将所有的符号和重定位資訊都将被抛棄,隻剩下二進制資料。

➤kernel鏡像格式:zImage

  zImage是ARM linux常用的一種壓縮鏡像檔案,它是由vmlinux經過objcopy , objcopy實作由vmlinux的elf檔案拷貝成純二進制資料檔案加上解壓代碼經gzip壓縮而成,指令格式是#make zImage.這種格式的Linux鏡像檔案多存放在NAND上. 适用于小核心的情況,它的存在是為了向後的相容性。

Linux核心鏡像格式Linux核心鏡像格式&lt;Linux核心鏡像的産生過程&gt;&lt;wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;"&gt;

➤kernel鏡像格式:bzImage

  bzImage不是用bzip2壓縮的,bz表示big zImage,其格式與zImage類似,但采用了不同的壓縮算法,注意,bzImage的壓縮率更高 ,是壓縮的核心映像。 

  zImage/bzImage:它們不僅是一個壓縮檔案,而且在這兩個檔案的開頭部分内嵌有解壓縮代碼。兩者的不同之處在于,老的zImage解壓縮核心到低端記憶體(第一個 640K),bzImage解壓縮核心到高端記憶體(1M以上)。如果核心比較小,那麼可以采用zImage或bzImage之一,兩種方式引導的系統運作時是相同的。大的核心采用bzImage,不能采用zImage。

➤kernel鏡像格式:uImage

  uImage是uboot專用的鏡像檔案,它是在 zImage 之前加上一個長度為0x40的頭資訊(tag)(也就是說uImage 是一個二進制檔案),在頭資訊内說明了該鏡像檔案的類型、加載 位置、生成時間、大小等資訊.換句話說,若直接從uImage的0x40位置開始執行,則zImage和uImage沒有任何差別.指令格式是#make uImage.這種格式的Linux鏡像檔案多存放在NAND上. 

Linux核心鏡像格式Linux核心鏡像格式&lt;Linux核心鏡像的産生過程&gt;&lt;wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;"&gt;

➣怎麼生成uImage  

    在uboot的/tools目錄下尋找mkimage檔案,把其copy到系統/usr/local/bin目錄下,這樣就完成制作工具。然後在核心目錄下運作make uImage,如果成功,便可以在arch/arm/boot/目錄下發現uImage檔案,其大小比zImage多64個位元組。 

  由于bootloader一般要占用0x0位址,是以,uImage相比zImage的好處就是可以和bootloader共存。其實就是一個自動跟手動的差別,有了uImage頭部的描述,u-boot就知道對應Image的資訊,如果沒有頭部則需要自己手動去搞那些參數。

➤kernel鏡像格式:xipImage

  這種格式的Linux鏡像檔案多存放在NorFlash上,且運作時不需要拷貝到記憶體SDRAM中,可以直接在NorFlash中運作.

<Linux核心鏡像的産生過程>

  在嵌入式Linux中,核心的啟動過程分為兩個階段.其中,第一階段啟動代碼放在arch/arm/kernel/head.S檔案中,該檔案與體系結構相關,與開發闆周邊硬體無關,主要是初始化ARM核心等.第二階段啟動代碼是init目錄下的main.c.現以執行指令#make zImage為例來說明,arm-linux核心鏡像的産生過程.

➣當使用者對Linux核心源碼進行編譯時,kernel的第1/2階段代碼會生成可執行檔案vmlinux,該檔案是未被壓縮的鏡像檔案,非常大,不能直接下載下傳到NAND中,通常放在PC機上,這也是最原始的Linux鏡像檔案.一般該檔案約50M左右.

➣鏡像檔案vmlinux由于很大,肯定不能直接燒入NAND中,是以需要進行二進制化,即經過objcopy處理,使之隻包含二進制資料的核心代 碼,去除不需要的檔案資訊等,這樣就制作成了image鏡像檔案.該鏡像檔案也是未壓縮,隻是經過了二進制化而變小.該檔案約5M左右.

➣ 一般來說,記憶體SDRAM中的核心鏡像是經過壓縮的,隻是在運作時再将其解壓.是以,編譯時會先使用gzip将鏡像檔案image進行壓縮(壓縮比約為 2:1),再将壓縮後的鏡像檔案和源碼中的兩個檔案arch/arm/boot/compressed/head.S、arch/arm/boot /compressed/misc.c一起連結生成壓縮後的鏡像檔案compress/vmlinux.該檔案約為2.5M左右。注意,這兩個源碼檔案是解壓程式,用于将記憶體SDRAM中的壓縮鏡像zImage進行解壓.

➣壓縮後的鏡像檔案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鏡像檔案大小相同.

<注意事項>

➣網站:http://lxr.linux.no/該網站通過了Linux核心源碼,不用解壓,線上查詢,非常友善.

➣生成的鏡像檔案vmlinux放在源碼的頂層目錄下.

➣生成的鏡像檔案image、zImage均在arch/arm/boot目錄下.

➣啟動開發闆時,在超級終端内會有許多的提示資訊,其中: 

➣booting linux … /表示正在将核心從NAND拷貝到記憶體中/ 

➣unpressed… /表示正在解壓核心/

➣隻有當使用者輸入boot指令或在boot_delay延時時間後,vivi才将NANDFlash中的核心kernel拷貝到記憶體SDRAM中.也就是說,當vivi進入指令行模式時,在SDRAM中并沒有核心kernel.

➣在kernel源碼目錄下執行指令: 

➣<1> #tree /列印出kernel源碼的目錄結構/ 

➣<2> #tree -L 1 /列印出kernel源碼的第一級目錄結構/ 

➣<3> #tree > /home/lishuai/linux.txt /将kernel源碼的目錄結構重定向到某個檔案中,使用者可以随時檢視其目錄結構,非常友善/

<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">

繼續閱讀