版权声明:*本文章参考了《Linux内核官方文档》。未经作者允许,严禁用于商业出版**,否则追究法律责任。网络转载请注明出处,这是对原创者的起码的尊重!!!*

1 Linux内核镜像格式

  Linux内核有多种格式的镜像,包括vmlinux、vmlinuz,Image、zImage、bzImage、uImage、xipImage、bootpImage等.

Created with Raphaël 2.2.0vmlinuxImagebzImage/zImage/vmlinuzuImage

1.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没有任何区别。命令格式是make uImage,这种格式的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] 显示[image_header结构体]中的头信息
创建传统镜像
-A [architecture] 设置体系架构。
-O [os] 设置操作系统。 u-boot的bootm命令按os类型更改引导方法。
-T [image type] 设置镜像类型。
-C [compression type] 设置压缩类型。
-a [load addess] 设置十六进制的载入地址
-e [entry point] 设置十六进制的进入点
-n [image name] 设置镜像名称
-d [image data file] 使用镜像数据来源
-x 设置XIP旗标。即不进行文件的拷贝,在当前位置执行
创建FIT镜像
-c [comment] 指定签名时要添加的注释。
-D [dtc options] 为用于创建映像的设备树编译器提供特殊选项。
-f [image tree source file] 描述FIT镜像结构和内容的镜像树源文件
-F 表示现有的FIT镜像应修改。不执行dtc编译,不应给出-f标志。这可用于在初始镜像创建后使用附加KEY对镜像进行签名。
-k [key_directory] 指定含有用于签名的key的目录,该目录应该含有用于签名的私钥name.key和用于验证的整数name.crt
-K [key_destination] 指定dtb文件以写入公钥。
-r 指定用于签署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内核官方文档》。未经作者允许,严禁用于商业出版**,否则追究法律责任。网络转载请注明出处,这是对原创者的起码的尊重!!!*


Linux内核镜像格式相关推荐

  1. linux常用的内核镜像格式

    linux常用的内核镜像格式 Linux内核有多种格式的镜像,包括vmlinux.Image.zImage等. 1.     Linux内核镜像格式 1.1 vmlinux vmlinuz是可引导的. ...

  2. Linux内核镜像文件格式与生成过程(转)

    <Linux内核镜像格式>   Linux内核有多种格式的镜像,包括vmlinux.Image.zImage.bzImage.uImage.xipImage.bootpImage等. ➤k ...

  3. linux内核镜像解压,解压内核镜像

    uboot 将 zimage 复制到内存之后,跳转到 zimage 处开始执行,首先执行的代码是 arch/arm/boot/compressed/head.s 文件,首先是一些涉及不同体系结构调试相 ...

  4. 测试linux内核镜像,测试Petalinux BSP镜像参考例子

    测试预构建Petalinux镜像 现在,你可以尝试一个预构建参考例.这是通过petalinux-boot 工具来实现的.petalinux-boot可以在物理硬件或者QEMU上启动参考例子. 在硬件上 ...

  5. (二)linux内核镜像制作

    (一)目的 在进行嵌入式开发的时候,我们往往会先在电脑上安装交叉编译器,然后编译目标板上的代码,最后把代码下载到电路板中,嵌入式系统组成包括:BootLoader+kernel+filesystem+ ...

  6. linux内核镜像的分层,Docker镜像分层的原理详解

    base镜像 base镜像有两层含义: 不依赖其他镜像,从scratch构建 其他镜像可以之为基础进行扩展 所以,base镜像一般都是各种Linux发行版本的Docker镜像,比如:Ubuntu,De ...

  7. Linux内核镜像 —— vmlinux与xImage

    0 前言 编译Linux内核生成的镜像主要有Image.zImage.bzImage和uImage四种: Image为内核映像文件: zImage为内核的一种映像压缩文件: uImage是uboot专 ...

  8. 国内linux内核镜像仓库,国内较快的maven仓库镜像

    国内连接maven官方的仓库更新依赖库,网速一般很慢,收集一些国内快速的maven仓库镜像以备用. ====================国内OSChina提供的镜像,非常不错=========== ...

  9. linux内核镜像sd卡,【原创】Linux QT镜像的制作--制作SD卡启动盘

    最近买了个新的开发板,原生的是Android操作系统,需要自己少个启动盘,制作Linux+QT操作系统. 新的开发板带这个制作的源文件,要先把这个文件拷贝到虚拟机Ubunbtu的共享目录下. 打开sh ...

最新文章

  1. python加减法视频教程免费_一起学opencv-python三十八(视频分析:背景减法)
  2. dhcp snooping+IPSG的一些理解
  3. C++ Opengl 透明纹理源码
  4. 有关线程安全的概念范畴
  5. Centos7 安装Oracle JDK1.8和OpenJDK 1.8
  6. ansible之cron模块
  7. 201803101101_《函数的原始写法》
  8. std::vector内存清理
  9. JAVA调用海康威视SDK
  10. iOS Xcode12安装P12证书问题
  11. 为串联机械臂写一个ROS控制器
  12. 网页资源下载 -- 水浒传全集
  13. 级联rc滤波_六阶级联式开关电容低通滤波器设计与仿真分析
  14. 微信公众号开发:获取openId和用户信息(完整版)
  15. 冷门高性价比蓝牙耳机,不是烧友一定很少知道的五大蓝牙耳机品牌
  16. tf.train.exponential_decay的用法
  17. matlab基础及应用 李国朝,Matlab基础与应用(李晓鹏)
  18. shchangenotifyregister 监视子文件夹文件改变_真假文件夹?FakeFolder病毒再次捣乱企业内网...
  19. Excel快速输入对勾和错号
  20. HTML、HTML5、XHTML、XML、XSL、DTD、XML Schema 简单介绍

热门文章

  1. python后端开发web_WEB开发系列3:一步步打造强大的Python后端开发环境
  2. java基于springboot+vue的酒店预订网站——计算机毕业设计
  3. 静态网页爬虫教程(1)页面的获取
  4. 提升下属逆商的44种方法(逆商节选)
  5. bat脚本输入密码_Mysql修改密码20190511
  6. 个人办理上海人才居住证
  7. win server无法安装无线网卡驱动
  8. mos管结电容等效模型_详解MOS管的米勒效应,图文详解
  9. Pycharm工具专业版完美破解
  10. beego model获取controller_Goweb开发-Beego框架实战教程:项目搭建及注册用户