2023年8月3日发(作者:)
Linux内核镜像格式 版权声明:*本⽂章参考了《Linux内核官⽅⽂档》。未经作者允许,严禁⽤于商业出版**,否则追究法律责任。⽹络转载请注明出处,这是对原创者的起码的尊重*1 Linux内核镜像格式 Linux内核有多种格式的镜像,包括vmlinux、vmlinuz,Image、zImage、bzImage、uImage、xipImage、bootpImage等.vmlinuxImagebzImage/zImage/vmlinuzuImage1.1 vmlinux vmlinuz是可引导的、可压缩的内核镜像,vm代表Virtual Memory。Linux⽀持虚拟内存,因此得名vm。它是由⽤户对内核源码编译得到,实质是elf格式的⽂件。也就是说,vmlinux是编译出来的最原始的内核⽂件,未压缩,⽐较⼤。这种格式的镜像⽂件多存放在PC机上,⼤约为50MB。ELF,Executable and Linkable Format,可执⾏可链接格式,是UNIX实验室作为应⽤程序⼆进制接⼝⽽发布的,扩展名为elf。可以简单的认为,在elf格式的⽂件中,除⼆进制代码外,还包括该可执⾏⽂件的某些信息,⽐如符号表等。1.2 vmlinuz vmlinuz是可引导的、压缩过的内核。“vm”代表“Virtual Memory”。vmlinuz是可执⾏ 的Linux内核,它位于/boot/vmlinuz,它⼀般是⼀个软链接。vmlinuz的建⽴有两种⽅式:⼀是编译内核时通过“make zImage”创建,⼿动拷贝到/boot⽬录下⾯。zImage适⽤于⼩内核的情况,它的存在是为了向后的兼容性。⼆是内核编译时通过命令make bzImage创建,然后⼿动拷贝⾄/boot⽬录下。1.3 Image Image是经过objcopy处理的只包含⼆进制数据的内核代码,它已经不是elf格式了,但这种格式的内核镜像还没有经过压缩。GNU使⽤⼯具程序objcopy作⽤是拷贝⼀个⽬标⽂件的内容到另⼀个⽬标⽂件中,也就是说,可以将⼀种格式的⽬标⽂件转换成另⼀种格式的⽬标⽂件。 通过使⽤binary作为输出⽬标(-o binary),可产⽣⼀个原始的⼆进制⽂件,实质上是将所有的符号和重定位信息都将被抛弃,只剩下⼆进制数据。1.4 zImage和bzImage zImage是ARM linux常⽤的⼀种压缩镜像⽂件,它是由vmlinux加上解压代码经gzip压缩⽽成,命令格式是make zImage。这种格式的Linux镜像⽂件多存放在NAND上。 bz表⽰big zImage,其格式与zImage类似,但采⽤了不同的压缩算法,注意,bzImage的压缩率更⾼。bzImage不是⽤bzip2压缩的,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。1.5 uImage uImage是uboot专⽤的镜像⽂件,它是在zImage之前加上⼀个长度为64B的头信息(tag),在头信息内说明了该镜像⽂件的类型、加载位置、⽣成时间、⼤⼩等信息。换句话说,若直接从uImage的0x40位置开始执⾏,则zImage和uImage没有任何区别。命令格式是makeuImage,这种格式的Linux镜像⽂件多存放在NAND 上。64字节的头结构如下:typedef struct image_header
{ uint32_tih_magic; uint32_tih_hcrc; uint32_tih_time; uint32_tih_size; uint32_tih_load; uint32_tih_ep; uint32_tih_dcrc; uint8_tih_os; uint8_tih_arch; uint8_tih_type; uint8_tih_comp; uint8_tih_name[IH_NMLEN];} image_header_t;所以,uImage和zImage都是压缩后的内核映像。⽽uImage是⽤mkimage⼯具根据zImage制作⽽来的。mkimage⼯具介绍如下:u-boot⾥⾯的mkimage⼯具来⽣成uImage(u-boot源码包/tools/mkimage.c ) 命令:mkimage -l [uimage file name] mkimage [options] -f [image tree source file] [uimage file name] mkimage [options] -F [uimage file name] mkimage [options] (legacy mode) 描述:mkimage命令⽤于创建与 U-Boot引导加载程序⼀起使⽤的映像。这些映像可以包含linux内核,设备树blob,根⽂件系统映像,固件映像等,可以单独使⽤,也可以组合使⽤。mkimage⽀持两种不同的格式:旧的传统镜像格式连接各个部分(例如,内核映像,设备树blob和ramdisk映像),并添加⼀个64字节的标头,其中包含有关⽬标体系结构,操作系统,图像类型,压缩⽅法,⼊⼝点,时间戳,校验和等。新的FIT(平⾯镜像树)格式允许更灵活地处理各种类型的镜像,并且还通过更强校验来增强镜像的完整性保护。 它还⽀持启动验证。选项l [[u]image file name]创建传统镜像-A [architecture]-O [os]-T [image type]-C [compression type]-a [load addess]-e [entry point]-n [image name]-d [image data file]描述显⽰[image_header结构体]中的头信息设置体系架构。设置操作系统。 u-boot的bootm命令按os类型更改引导⽅法。设置镜像类型。设置压缩类型。设置⼗六进制的载⼊地址设置⼗六进制的进⼊点设置镜像名称使⽤镜像数据来源选项-x创建FIT镜像-c [comment]-D [dtc options]-f [image tree source file]-F-k [key_directory]-K [key_destination]-r 描述设置XIP旗标。即不进⾏⽂件的拷贝,在当前位置执⾏指定签名时要添加的注释。为⽤于创建映像的设备树编译器提供特殊选项。描述FIT镜像结构和内容的镜像树源⽂件表⽰现有的FIT镜像应修改。不执⾏dtc编译,不应给出-f标志。这可⽤于在初始镜像创建后使⽤附加KEY对镜像进⾏签名。指定含有⽤于签名的key的⽬录,该⽬录应该含有⽤于签名的私钥和⽤于验证的整数指定dtb⽂件以写⼊公钥。指定⽤于签署FIT的密钥是必需的。 这意味着必须验证它们才能启动映像。 如果没有此选项,验证将是可选的。##1.6 xipImage 这种格式的Linux镜像⽂件多存放在NorFlash上,且运⾏时不需要拷贝到内存SDRAM中,可以直接在NorFlash中运⾏。#2 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镜像⽂件⼤⼩相同。 版权声明:*本⽂章参考了《Linux内核官⽅⽂档》。未经作者允许,严禁⽤于商业出版**,否则追究法律责任。⽹络转载请注明出处,这是对原创者的起码的尊重*
发布者:admin,转转请注明出处:http://www.yc00.com/web/1691031901a491089.html
评论列表(0条)