摘要:
简述几种常用的内核镜像文件: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系统启动。
使用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、镜像生成过程概览
镜像生成过程概览:
出售Agilent86102U光/电模块
iPhone手机电池使用维护指南
滴滴出行和软银集团合资企业滴滴日本 网约车服务扩展日本13个城市
EGAX-5-C20007加速度传感器在汽车ABS系统中的应用
什么是覆铜?网格覆铜还是实心覆铜?
Linux内核常用的几种镜像文件
德国利用3D打印建造居民楼
RS-LB-210油烟监测仪
光纤传输的基础知识
晶科能源获授“ISSB国际可持续披露准则先学伙伴”证书
安森美半导体发布2019年第1季度业绩
哈罗等顺风车因存在非法网约车行为被约谈
首款支持男生音色的智能音箱,可随心切换男女音色
越南将是半导体市场新贵
碳酸锂价格进入深度博弈
新闻资讯 |湖北移动多功能5G智慧路灯亮相随州
HSDPA:3G竿头更进一步
艾讯科技新品层出又一款CPU 卡和平板电脑全新上市
wifi路由器信号越来越差,我们应该怎么样找对问题
基于FPGA的步进电机控制实现