Linux核心映象

2021-08-01 12:56:30 字數 4317 閱讀 2184

核心映象有許多種,但是基本都是基於vmlinux壓縮加頭得到,目的是為了讓核心映象盡可能的小,在嵌入式中儲存介質的空間比較小,也比較緊張,這些壓縮映象是為了去適應嵌入式而產生的

核心編譯(make)之後

會生成兩個檔案,乙個image,乙個zimage

,其中image為核心映像檔案,而zimage為核心的一種映像壓縮檔案,image大約為4m,而zimage不到2m。

那麼uimage又是什麼的?它是

uboot專用的映像檔案

,它是在zimage之前加上乙個長度為64位元組的「頭」,說明這個核心的版本、載入位置、生成時間、大小等資訊;其0x40之後與zimage沒區別。

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

其實就是乙個自動跟手動的區別,有了uimage頭部的描述,u-boot就知道對應image的資訊,如果沒有頭部則需要自己手動去搞那些引數。

u-boot的u是「通用」的意思。

zimage 是arm linux常用的一種壓縮映像檔案,

uimage是u-boot專用的映像檔案,它是在zimage之前加上乙個長度為0x40的「頭」,說明 這個映像檔案的型別、載入位置、生成時間、大小等資訊。

換句話說,如果直接從uimage的0x40位置開始執行,zimage和uimage沒有任何區 別。另外,linux2.4核心不支援uimage,linux2.6核心加入了很多對嵌入式系統的支援,但是uimage的生成也需要設定。

linux核心有多種格式的映象,包括vmlinux、image(vmlinux.bin?)、zimage(vmlinux.bin.gz)、bzimage、uimage、xipimage、bootpimage等.

vmlinux是可引導的、未壓縮、可壓縮的核心映象

,vm代表virtual memory.linux支援虛擬記憶體,因此得名vm.它是由使用者對核心原始碼編譯得到,實質是

elf格式的檔案.

也就是說vmlinux是編譯出來的最原始的核心檔案,未壓縮.這種格式的映象檔案多存放在pc機上.

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建立

。image是經過

objcopy處理的只包含二進位制資料的核心**

,它已經不是elf格式了,但這種格式的核心映象還沒有經過壓縮.

objcopy 

gnu使用工具程式objcopy作用是拷貝乙個目標檔案的內容到另乙個目標檔案中,也就是說,可以將一種格式的目標檔案轉換成另一種格式的目標檔案. 通過使用binary作為輸出目標(-o binary),可產生乙個原始的二進位制檔案,實質上是將所有的符號和重定位資訊都將被拋棄,只剩下二進位制資料.

zimage是arm linux常用的一種壓縮映象檔案,它是由

vmlinux加上解壓**經gzip壓縮而成

,命令格式是#make zimage.這種格式的linux映象檔案多存放在nand上. 

適用於小核心的情況,它的存在是為了向後的相容性。

bzimage不是用

bzip2壓縮

的,bz表示big zimage,其格式與zimage類似,但採用了不同的壓縮

演算法,注意,

bzimage的壓縮率更高 是壓縮的核心映像

。 zimage bzimage:它們不僅是乙個壓縮檔案,而且在這兩個檔案的開頭部分內

嵌有解壓縮**

。兩者的不同之處在於,老的zimage解壓縮核心到低端記憶體(第乙個 640k),bzimage解壓縮核心到高階記憶體(1m以上)。如果核心比較小,那麼可以採用zimage或bzimage之一,兩種方式引導的系統執行 時是相同的。大的核心採用bzimage,不能採用zimage。

uimage是uboot專用的映象檔案

,它是在 zimage 之前加上乙個長度為0x40的頭資訊(tag),在頭資訊內說明了該映象檔案的型別、載入 位置、生成時間、大小等資訊.換句話說,若直接從

uimage的0x40位置開始執行

,則zimage和uimage沒有任何區別.命令格式是#make uimage.這種格式的linux映象檔案多存放在nand上. 

如何生成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的資訊,如果沒有頭部則需要自己手動去搞那些引數。

這種格式的linux映象檔案多存放在norflash上,且執行時不需要拷貝到記憶體sdram中,可以直接在norflash中執行.

在嵌入式linux中,核心的啟動過程分為兩個階段.其中,第一階段啟動**放在arch/arm/kernel/head.s檔案中,該檔案與體系結構相關,與開發板周邊硬體無關,主要是初始化arm核心等.第二階段啟動**是init目錄下的main.c.現以執行命令#make zimage為例來說明,arm-linux核心映象的產生過程.

(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映象檔案大小相同.

生成的映象檔案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原始碼的目錄結構重定向到某個檔案中,使用者可以隨時檢視其目錄結構,非常方便/

linux核心映象格式

一 linux核心映象格式 linux核心有多種格式的映象,包括vmlinux image zimage bzimage uimage xipimage bootpimage等.1 kernel映象格式 vmlinux vmlinuz是可引導的 可壓縮的核心映象,vm代表virtual memory...

linux核心映象格式

一 linux核心映象格式 linux核心有多種格式的映象,包括vmlinux image zimage bzimage uimage xipimage bootpimage等.1 kernel映象格式 vmlinux vmlinuz是可引導的 可壓縮的核心映象,vm代表virtual memory...

Linux學習之zImage核心映象解壓過程詳解

zimage核心映象解壓過程詳解 本文以linux 2.6.14核心在s3c2410平台上執行為例,講解核心的解壓過程。核心編譯完成後會生成zimage核心映象檔案。關於bootloader載入zimage到核心,並且 跳轉到zimage開始位址執行zimage的過程,相信大家都很容易理解。但對於z...