Coolsand的资源和代码压缩

注:以下信息来自互芯FAE


压缩分三种,分别是资源压缩、code压缩和data压缩。压缩的目的是overlay。下面简单描述一下。

资源压缩:
使用方法是在target.def里打开
MMI_EXPORT_FLAG += COMPRESS_OPTIMIZE_FLASH_SIZE
MMI_EXPORT_FLAG += COMPRESS_USE_LZMA
资源压缩是将每一个字符串数组StrRes_x[],不再用unicode编码保存,而是用lamz算法压缩后保存到名字为StrRes_x_lzma.tab的文件里,同时开辟一个大数组ch_StrRes_all[](计算每一个StrRes_x[]的大小,取最大值),在开机和语言切换的时候动态的将要被使用的StrRes_x_lzma.tab解压到ch_StrRes_all[]里。由于lzma算法的较高的解压速度和压缩率,在牺牲一个ch_StrRes_all[]大小的RAM的情况下,可以节省至少一半的StrRes_x[]*语言数量的ROM空间,这点在语言较多的情况下优势尤其明显。
注意:
1、资源压缩只有上面的宏开关,并没有其它的地址配置;
2、开机时会比非压缩的情况下多用1秒左右的时间解压;
3、由于ch_StrRes_all[]在某些语种下比较大,在3216的配置下有些项目的RAM会比较紧张,此时可以考虑不开资源压缩。

code压缩:
使用方法是在target.def里打开
CT_COMPRESS_CODE_SECTION ?= yes
并定义两个变量
COMPRESS_STATE ?=
COMPRESS_STRATEGY ?=
一般来说,有如下几种配置,对于3232:
COMPRESS_STATE ?=
COMPRESS_STRATEGY ?= 2
对于3264:
COMPRESS_STATE ?= 3264
COMPRESS_STRATEGY ?=
对于6464:
COMPRESS_STATE ?= 6464
COMPRESS_STRATEGY ?= 1
代码压缩在编译期和非压缩情况基本是一样的,在链接期,分两次链接。第一次链接(stage1)的map是这样的(以3232为例):
————————————    
code等段
————————————    上面和非压缩的map基本一致,从这里开始是get_compressed_data段
get_compressed_data在stage1的时候只是分配了一个函数和一些地址变量,并将这些变量地址初始化为0,其在第二次链接的时候要用到
————————————    从这里开始是代码的第1个overlay段,起始地址是由XCPU_OVERLAY_BASE决定的,XCPU_OVERLAY_BASE这个变量一般在对应的memd.def里定义
第1个overlay,目前共有5个段,分别是xcpu_overlay_init_func、xcpu_overlay_csdapp、xcpu_overlay_wap、xcpu_overlay_jmetoc和xcpu_overlay_other,起始地址是XCPU_OVERLAY_BASE
————————————    第2个overlay段的起始地址是第1个overlay的起始地址+上述5个段的size的最大值
第2个overlay,目前共有5个段,分别是overlay_2_section_1、overlay_2_section_2、overlay_2_section_3
————————————    第3个overlay段的起始地址是第2个overlay的起始地址+上述5个段的size的最大值
第3个overlay,目前共有5个段,分别是overlay_3_section_1、overlay_3_section_2、overlay_3_section_3
————————————    第4个overlay段的起始地址是第3个overlay的起始地址+上述5个段的size的最大值
第4个overlay,目前共有11个段,分别是overlay_4_section_1到overlay_4_section_11
————————————    overlay的结束地址
一些没用的ram空间
————————————    ram的结束地址
以上overlay段提到的地址都是虚拟地址(此处等于运行地址),其载入地址使用了一个假的地址,这里要注意一下,北京以后可能会改掉这种用法。
stage1生成的文件以-stage1结尾。
然后进行第二次链接(stage2),
1、生成压缩文件xxx.bin.lzma.o,步骤是先将某段从elf-stage1中以binary格式拷贝出来生成段名.bin,用lzma算法压缩生成段名.bin.lzma,再生成新的elf格式的段名.bin.lzma.o文件;
2、stage2先由elf-stage1生成link_stage1_elf.ld文件,直接由stage2链接的时候作为ld脚本的一部分使用;
3、生成新的ld文件,include上面的link_stage1_elf.ld文件;
4、将.get_compressed_data段从elf-stage1中去掉,因为我们要手动重定位.get_compressed_data中一些地址的值(在stage1中都初始化为0了);
5、此时所有符号都可被定位了,进行最后的链接,map新增的段如下:
————————————    
code等段
————————————    上面和非压缩的map基本一致,从这里开始是get_compressed_data段
get_compressed_data在stage1的时候只是分配了一个函数
————————————    下面是压缩段,地址紧靠上面对齐
每个压缩段的内容
————————————    
一些结论
1、目前的overlay和每个overlay包含的段建议不要修改,目前预留的overlay和段足够以后使用了,即使不用也基本不占用rom/ram空间;如果要修改,采取如下步骤(以3232去掉xcpu_overlay_init_func段为例):
    1)将compress_code_section.ld中.xcpu_overlay_init_func极其包含的内容都去掉,将FLASH_SIZE_OF_XCPU_OVERLAY_0和MAX_SIZE_OF_XCPU_OVERLAY_0中对.xcpu_overlay_init_func的引用去掉;
    2)将exclude_file_list.ld中所有.xcpu_overlay_init_func相关的.o文件都去掉;
    3)将soft\application\coolmmi\mmi\cdflashus\compressed_stub\compress_section_list.cfg中的xcpu_overlay_init_func去掉;
    4)将modem2G_master.ld中的两处init_func_start和init_func_end去掉,第二处要去掉
            init_func_start = .;
        *xcpu_overlay_init_func.bin.lzma.o(.data .data.*)
        init_func_end = .;
        . = ALIGN(0x4);
    5)修改get_compressed_data.c,去掉所有init_func_start和init_func_end相关的代码;        
2、可以对每个段进行微调。例如要将apbs.o从overlay里去掉,采取如下步骤(以3232为例):
    1)在compress_code_section.ld中去掉*apbs.o(.text .text.* .rodata .rodata.*)
    2)在exclude_file_list.ld中去掉*apbs.o
3、每个overlay段都有NOCROSSREFS标志,所以不必担心段内的section彼此直接被引用,如果彼此被引用在链接期就会报错;
4、如果rom空间剩余比较多而ram比较紧张(反之亦然),可以对overlay段的大小进行调整,例如将overlay段总体后移0x10000,采取如下步骤(以3232为例):
    1)在对应的memd.def里,将RAM_SIZE从0x00270000改为0x00280000;
    2)将compress_code_section.ld中_xcpu_overlay_secton_sizelimit从1600K改为1536K;
5、exclude_file_list.ld的“优先级”高于compress_code_section.ld,也就是说如果没有在exclude_file_list.ld中将某个.o列出,则其code段将不会被压缩会被放入code段,即使该.o在compress_code_section.ld中存在也无效。
6、上述修改只要能编译、链接通过,就是安全的。具体内部的细节可以不去深究。

data压缩:
略过。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值