Linux内核常用的几种镜像文件

嵌入式技术

1330人已加入

描述

摘要:

简述几种常用的内核镜像文件:vmlinux、Image、zImage、bzImage、uImage、bootpImage、XIPImage等等。

0、前言

《先让代码跑起来》一文曾介绍如何编译Linux kernel,基本上包含4个步骤:

  • 配置内核:使用make menuconfig等命令进行内核配置,在内核配置中,需要选择需要编译进内核的驱动程序,文件系统等选项,并选择适合目标系统的架构。
  • 编译内核:使用make命令进行源码编译。在编译时需要制定编译架构和交叉编译工具链等参数。
  • 生成镜像文件:以生成zImage为例:使用make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- zImage命令生成zImage。
  • 复制镜像文件到目标系统:将生成的Image文件通过网络或SD卡等方式复制到目标系统中。

接下来,我们就简单了解一下几种常见的内核镜像文件。

1、前言

1.1 vmlinux

vmlinux是linux内核编译后得到的elf格式的文件,它包含了linux内核所有的代码和符号表信息,但不包含文件系统和驱动模块等。

它是编译Linux内核源码得到的最原始的内核镜像文件,没有经过压缩,因此,它通常比较大,一般达到几十到一百多兆。

Linux

该镜像可用于定位内核问题,但是不能直接引导Linux系统启动。

使用file命令可以查看vmlinux的格式:

Linux

上图可知,vmlinux是elf格式文件,所以我们也可以使用readelf查看其头部信息:

Linux

1.2 Image

Image是在Linux内核编译时,使用objcopy去掉vmlinux中的一些符号表等信息后,生成的仅包含可执行二进制数据的内核镜像。

$(obj)/Image: vmlinux FORCE
    $(call if_changed,objcopy)

Image是一个可引导的内核镜像文件,它包含了Linux内核和一些启动参数,所以可直接引导Linux启动。

不过Image没有经过压缩(it is Uncompressed kernel image),因此也比较大。

Linux

1.3 zImage

zImage is Compressed kernel image,是内核的一种压缩形式,它是将vmlinux文件使用gzip压缩算法进行压缩得到的。

$(obj)/zImage:    $(obj)/compressed/vmlinux FORCE
    $(call if_changed,objcopy)

该镜像一般作为uboot的引导镜像文件,它支持32位和64位CPU,但是它只能被加载到内存地址低于16MB的位置。

Linux

生成zImage的命令在前言也提到过:

make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- zImage

需要注意的是,zImage只是一个可引导的内核镜像,如果要运行完整的Linux系统,还需要加载文件系统、设备树等组件。

1.4 bzImage

bzImage即big Image, 格式与zImage类似,它是通过Linux内核源码编译得到的vmlinux文件使用xz压缩算法得到的。

它支持32位和64位CPU,而且可以被加载到内存地址高于16M的位置,相比于zImage,bzImage可以支持更大的内核。

同样需要注意的是,bzImage只是一个可引导的内核镜像,如果要运行完整的Linux系统,还需要加载文件系统、设备树等组件。

1.5 uImage

uImage is uboot wrapped zImage,是用于嵌入式系统的Linux内核镜像文件,它是经过压缩和打包的。

$(obj)/uImage:    $(obj)/zImage FORCE
    @$(check_for_multiple_loadaddr)
    $(call if_changed,uimage)

它支持多种CPU架构和平台,可以被加载到ROM、flash或者SD卡等存储设备中。

通常来讲,uImage是较老版本uboot用的引导镜像文件,它是使用mkimage工具得到的,是在zImage前增加了一个64字节的头,这个头里面描述了内核版本号、编译时间、镜像文件类型、加载位置等信息。

现在的uboot都已经支持了zImage的启动,所以逐渐很少使用到uImage了。

既然它是基于zImage生成的,那么它如果要运行完整的Linux系统,还需要加载文件系统、设备树等组件。

1.6 bootpImage

bootpImage是一种用于网络启动的Linux内核镜像,它是通过将Linux内核代码编译得到的vmlinux文件进行压缩和打包得到的。

在使用网络启动时需要将生成的bootpImage文件复制到TFTP服务器上。

$(obj)/bootpImage: $(obj)/bootp/bootp FORCE
    $(call if_changed,objcopy)

1.7 XIPImage

XIP(eXecute-In-Place)是一种内核引导技术,它允许将内核直接映射到屋里内存中执行(常用的是NorFlash),而不需要将内核镜像加载到RAM上。

$(obj)/xipImage: vmlinux FORCE
    $(call if_changed,mkxip)
    @$(kecho) '  Physical Address of xipImage: $(CONFIG_XIP_PHYS_ADDR)'

XIPImage是一种用于XIP启动的Linux内核镜像,它是通过将Linux内核代码编译得到的vmlinux文件进行压缩和打包得到的。

Linux

上图可知,若要编译成xipImage,需要打开CONFIG_XIP_KERNEL宏。

1.7 其他镜像

除了上述常见的镜像类型外,根据不同的应用场景和需求,还可以产生其他的镜像类型,比如,Docker镜像、虚拟机镜像、Live CD镜像等等。

2、镜像生成过程概览

镜像生成过程概览:

Linux

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分