背景介绍
随着内核代码越来越多,导致内核的体积也开始增长起来。TRIM_UNUSED_KSYMS 宏控可以一定程度上减小内核体积,主要是通过对内核中一些用不到的符号进行裁剪。
裁剪原理
这个先不细说了,主要集中在几个脚本上(adjust_ksyms.sh、gen_autoksyms.sh)。大致原理是:根据内核的 module.order 文件里的内核模块,找到模块使用到的所有导出符号;接着将没用到的导出符号进行裁剪。
问题
这个方法虽然可以减小内核体积,但是有个缺点:非内核 ko 中如果也有导出符号,那么也需要将符号添加到白名单中,这样耦合性就太大了,会带来很多麻烦。为此这篇文件介绍一个简单的解耦方法。
解耦方法
在 ko 中使用导出符号时需要用到 include <inux/export.h> ,如果开了内核符号裁剪宏,那么就会去 auto_ksyms.h 头文件找这个符号是不是在导出白名单并且重定义了 __EXPORT_SYMBOL,如果不在,那么不导出。
解耦的方法就是在内核以及内核 ko 编译的时候使用符号裁剪机制,在编译外部ko 时使用以前的方案重新定义 __EXPORT_SYMBOL 即可。这样的话在内核编译的过程可以拆分为三段:使用符号裁剪定义的 __EXPORT_SYMBOL,内核及ko编译,重新定义 __EXPORT_SYMBOL 使能外部 ko 导出符号的编译。这个控制流程最好使用宏控比较好,这里起名为 CONFIG_ENABLE_MODULE_EXPORT