跳转至

内存优化

3 内存优化

本章将介绍一些通用的优化方法,主要包括:

• 保留内存优化。

• 内核使用内存优化。

• 用户空间使用内存优化。

3.1 保留内存优化

3.1.1 内核静态内存优化

内核静态内存包括内核代码段数据段。优化方法主要有如下几种:

1) 关闭不需要的模块,关闭模块下不需要的功能。

在内核根目录,执行scripts/ksize.py vmlinux各个模块的代码段数据段的统计信息。

2) 关闭内核调试功能。

3) 开启CONFIG_CC_OPTIMIZE_FOR_SIZE 宏,使能-Os编译参数。

4) 排查内核占用空间大的符号。

执行nm --size -r vmlinux,可以列出所有符号占用的内存。

5) 对于cortex-A7 架构,可以开启CONFIG_THUMB2_AVOID_R_ARM_THM_JUMP11 和CONFIG_THUMB2_KERNEL。

说明 开启THUMB 相关配置,会带来性能损失,具体损失根据实际平台典型应用场景进行测试。

3.1.2 DTB 内存优化

Tina 内核中提供的DTS 一般来说比较全面,对于特定的方案,往往用不了那么多,可以针对性的删除一些节点。

3.1.3 TEE 内存优化

Tina 中一些平台,会默认配置一些TEE 保留内存。对于特定方案来说,很有可能用不了那么多内存。TEE 默认保留配置与bl31.bin、optee-${CHIP}.bin是配套的,

因此修改时需要注意同步更新。

比如R329 默认配置了8M 内存(SHM 2M,ATF 1M,OS 1M,TA 4M),但是对于非安全方案来说,只需要保留ATF 就够了;对于不使用TA 的安全方案,只需要保留

ATF 与OS 的内存就可以了。

3.2 内核使用内存优化

由2.5.2 小节可知,内核使用的内存包括Slab、PageTable、KernelStack、CmaUsed、Vmalloc 等。

3.3 Slab 优化

目前Tina 上大部分方案默认选用的是SLUB 分配器。

1) 关闭slab 调试宏COFNIG_SLUB_DEBUG 与CONFIG_SLABINFO。

2) 尝试使用针对微小的嵌入式系统的SLOB。

3.4 内核模块优化

1) 不要开机全部加载,实时加载,实时卸载。

2) 将内核模块编译到内核镜像中。

3.5 用户空间使用内存优化

1) 使用更小的C 库。

2) 使用size 优化的编译选项,比如-Os,-mthumb等。

3) 将tmpfs 下大文件保持到flash 上。

4) 对于64 位CPU,可以使用32 位的rootfs。

5) 使用更小的库或应用程序。比如使用mbedtls,而不是openssl。

6) 减少守护进程数量,实时运行/关闭特定程序。

7) 将只被一次依赖的动态库转化为静态库。

8) 使用dlopen 来控制动态库的生存周期。

9) 优化程序源码。