Uboot之lz4压缩算法加速kernel解压快速启动

背景说明
为了满足嵌入式系统更快的启动速度需求,需要对uboot进行优化,保证原有功能的情况下,减少系统启动时间。

kernel的常见格式:
在uboot中使用boot命令时,会启动kernel,其中涉及到kernel的压缩与解压。

vmlinux:vmlinuz是可引导的、可压缩的内核镜像,vm代表 Virtual Memory。是由用户对内核源码编译得到,实质是elf格式的文件,内含符号表,可用于调试。


Image:Image是经过objcopy处理的只包含二进制数据的内核代码,未经过压缩。
zImage或Image.gz:zImage是ARM linux常用的一种压缩镜像文件,它是由vmlinux加上解压代码经gzip压缩而成,命令格式是#make zImage,这种格式的Linux镜像文件多存放在NAND上。


bzImage:bz表示big zImage,其格式与zImage类似,但采用了不同的压缩算法,都是使用了gzip压缩成,bzImage的压缩率更高,适用于大内核。


uImage:uImage是uboot专用的镜像文件,它是在zImage之前加上一个长度为0x40的头信息(tag),在头信息内说明了该镜像文件的类型、加载位置、生成时间、大小等信息.换句话说,若直接从uImage的0x40位置开始执行,则zImage和uImage没有任何区别.命令格式是#make uImage


ARM处理器上,一般都是zImage(arm32)、Image.gz(arm64)、uImage(uboot专用)。
 

衡量Kernel压缩/解压算法

1.压缩率高(压缩后的体积小)
2.解压速度快(快速解压)
3.压缩/解压时占用内存小

快速启动中的需求分析

1.Kernel压缩时由开发机(或服务器)压缩,内存占用和耗时可忽略;
2.uboot运行时内存空间大,解压算法占用内存大小可忽略;

压缩率与解压速度往往是此消彼长:

1.压缩率越高,则压缩后体积小,读取速度快,但解压耗时增大
2.压缩率越低,则压缩后体积大,读取速度慢,但解压耗时减小

使用LZ4代替GZIP

大部分ARM的系统镜像中kernel压缩方式都是GZIP,因为GZIP兼顾了压缩率与解压时间。lz4压缩率低于gzip,但是解压时间显著高于gunzip。

1.lz4是目前综合来看效率最高的压缩算法,更加侧重压缩解压速度,压缩比并不是第一。
2.在当前的安卓和苹果操作系统中,内存压缩技术就使用的是lz4算法,及时压缩手机内存以带来更多的内存空
间。
3.本质上是时间换空间。


1、两种压缩算法,文件大小相差多少?
压缩率都设为 -9(最高压缩率压缩)。同一个kernel镜像:lz4比gzip高了15%.

同时生成两个压缩后的Image.xx

在这里插入图片描述 

2、uboot中解压时间少了多少?
压缩后的Image≈6M时,uboot中lz4解压比gzip快了4倍!解压时间从182ms->40ms 

gzip方式解压耗时

lz4解压耗时 

上代码:

1、Image.lz4的生成:
在arch/arm64/Makefile中,添加Image.lz4的目标,声明目标(Image.lz4),目标(Image.lz4)则由Linux自带的命令编译生成

在这里插入图片描述 

 

2、uboot中解析:
将固定死的解压方式GZIP变成自己检测MAGIC来判断: 

在这里插入图片描述

运行时会根据head_magic进行判断,是gzip方式,调用gzip解压,是Image.lz4则调用lz4解压: 

在这里插入图片描述 

在这里插入图片描述 

猜你喜欢

转载自blog.csdn.net/u010164190/article/details/125122621
LZ4