linux常用的内核镜像格式
linux常用的內(nèi)核鏡像格式
?
Linux內(nèi)核有多種格式的鏡像,包括vmlinux、Image、zImage等。
?
1.?????Linux內(nèi)核鏡像格式
1.1 vmlinux
??vmlinuz是可引導(dǎo)的、可壓縮的內(nèi)核鏡像,vm代表Virtual Memory.Linux支持虛擬內(nèi)存,因此得名vm.它是由用戶對(duì)內(nèi)核源碼編譯得到,實(shí)質(zhì)是elf格式的文件.也就是說,vmlinux是編譯出來的最原始的內(nèi)核文件,未壓縮.這種格式的鏡像文件多存放在PC機(jī)上.
?
Elf(ELF,Executableand Linkable Format)格式文件,可執(zhí)行可鏈接格式,是UNIX實(shí)驗(yàn)室作為應(yīng)用程序二進(jìn)制接口而發(fā)布的,擴(kuò)展名為elf.可以簡(jiǎn)單的認(rèn)為,在elf格式的文件中,除二進(jìn)制代 碼外,還包括該可執(zhí)行文件的某些信息,比如符號(hào)表等。
?
Android平臺(tái),生成的vmlinux文件位于:
out \target\product\msm8909\obj\KERNEL_OBJ
?
1.2? Image
??Image是經(jīng)過objcopy處理的只包含二進(jìn)制數(shù)據(jù)的內(nèi)核代碼,它已經(jīng)不是elf格式了,但這種格式的內(nèi)核鏡像還沒有經(jīng)過壓縮.
?
Objcopy,標(biāo)文件中,也就是說,可以將一種格式的目標(biāo)文件轉(zhuǎn)換成另一種格式的目標(biāo)文件. 通過使用binary作為輸出目標(biāo)(-obinary),可產(chǎn)生一個(gè)原始的二進(jìn)制文件,實(shí)質(zhì)上是將所有的符號(hào)和重定位信息都將被拋棄,只剩下二進(jìn)制數(shù)據(jù)。
?
Android平臺(tái),生成的Image文件位于:
out \target\product\msm8909\obj\KERNEL_OBJ\arch\arm\boot
?
1.3 zImage
??zImage是ARM linux常用的一種壓縮鏡像文件,它是由vmlinux加上解壓代碼經(jīng)gzip壓縮而成,命令格式是#make zImage.這種格式的Linux鏡像文件多存放在EMMC上.
?
Android平臺(tái),生成的zImage文件位于:
out \target\product\msm8909\obj\KERNEL_OBJ\arch\arm\boot
?
?
2.?????Linux內(nèi)核鏡像的產(chǎn)生過程
在嵌入式Linux中,內(nèi)核的啟動(dòng)過程分為兩個(gè)階段.其中,第一階段啟動(dòng)代碼放在arch/arm/kernel/head.S文件中,該文件與體系相關(guān),與用戶的開發(fā)板無關(guān),主要是初始化ARM內(nèi)核等.第二階段啟動(dòng)代碼是init目錄下的main.c.現(xiàn)以執(zhí)行命令#make zImage為例來說明,arm-linux內(nèi)核鏡像的產(chǎn)生過程.
(1)??當(dāng)用戶對(duì)Linux內(nèi)核源碼進(jìn)行編譯時(shí),kernel的第1/2階段代碼會(huì)生成可執(zhí)行文件vmlinux,該文件是未被壓縮的鏡像文件,非常大,不能直接下載到EMMC中,通常放在PC機(jī)上,這也是最原始的Linux鏡像文件,我們Android平臺(tái)下此文件大小為144MB左右。
?
(2)??鏡像文件vmlinux由于很大,肯定不能直接燒入EMMC中,因此需要進(jìn)行二進(jìn)制化,即經(jīng)過objcopy處理,使之只包含二進(jìn)制數(shù)據(jù)的內(nèi)核代碼,去除不需要的文件信息等,這樣就制作成了image鏡像文件.該鏡像文件也是未壓縮,只是經(jīng)過了二進(jìn)制化而變小,我們Android平臺(tái)下此文件大小為17MB左右。
?
(3)??一般來說,內(nèi)存SDRAM中的內(nèi)核鏡像是經(jīng)過壓縮的,只是在運(yùn)行時(shí)再將其解壓.所以,編譯時(shí)會(huì)先使用gzip將鏡像文件image進(jìn)行壓縮(壓縮比約為 2:1),再將壓縮后的鏡像文件和源碼中的兩個(gè)文件arch/arm/boot/compressed/head.S、arch/arm/boot/compressed/misc.c一起鏈接生成壓縮后的鏡像文件compress/vmlinux,我們Android平臺(tái)下此文件大小為7M左右,注意,這兩個(gè)源碼文件是解壓程序,用于將內(nèi)存SDRAM中的壓縮鏡像zImage進(jìn)行解壓。
?
(4)??壓縮后的鏡像文件compress/vmlinux經(jīng)過二進(jìn)制化,最終生成鏡像文件zImage,我們Android平臺(tái)下此文件大小為7M左右。當(dāng)然,在內(nèi)存 SDRAM中運(yùn)行壓縮鏡像文件zImage時(shí),會(huì)首先調(diào)用兩個(gè)解壓程序arch/arm /boot/compressed/head.S、arch/arm/boot/compressed/misc.c將自身解壓,然后再執(zhí)行kernel 的第一階段啟動(dòng)代碼arch/arm/kernel/head.S.簡(jiǎn)而言之,在內(nèi)存中運(yùn)行內(nèi)核時(shí),kernel先自身解壓,再執(zhí)行第一階段啟動(dòng)代碼。
?
?
?
總結(jié)
以上是生活随笔為你收集整理的linux常用的内核镜像格式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: lk启动流程详细分析
- 下一篇: arm-linux内核编译过程小结