嵌入式技术
摘要:
简述几种常用的内核镜像文件:vmlinux、Image、zImage、bzImage、uImage、bootpImage、XIPImage等等。
0、前言
《先让代码跑起来》一文曾介绍如何编译Linux kernel,基本上包含4个步骤:
接下来,我们就简单了解一下几种常见的内核镜像文件。
1、前言
1.1 vmlinux
vmlinux是linux内核编译后得到的elf格式的文件,它包含了linux内核所有的代码和符号表信息,但不包含文件系统和驱动模块等。
它是编译Linux内核源码得到的最原始的内核镜像文件,没有经过压缩,因此,它通常比较大,一般达到几十到一百多兆。
该镜像可用于定位内核问题,但是不能直接引导Linux系统启动。
使用file命令可以查看vmlinux的格式:
上图可知,vmlinux是elf格式文件,所以我们也可以使用readelf查看其头部信息:
1.2 Image
Image是在Linux内核编译时,使用objcopy去掉vmlinux中的一些符号表等信息后,生成的仅包含可执行二进制数据的内核镜像。
$(obj)/Image: vmlinux FORCE
$(call if_changed,objcopy)
Image是一个可引导的内核镜像文件,它包含了Linux内核和一些启动参数,所以可直接引导Linux启动。
不过Image没有经过压缩(it is Uncompressed kernel image),因此也比较大。
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的位置。
生成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文件进行压缩和打包得到的。
上图可知,若要编译成xipImage,需要打开CONFIG_XIP_KERNEL宏。
1.7 其他镜像
除了上述常见的镜像类型外,根据不同的应用场景和需求,还可以产生其他的镜像类型,比如,Docker镜像、虚拟机镜像、Live CD镜像等等。
2、镜像生成过程概览
镜像生成过程概览:
全部0条评论
快来发表一下你的评论吧 !