瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工智能应用。RK3568 支持安卓 11 和 linux 系统,主要面向物联网网关、NVR 存储、工控平板、工业检测、工控盒、卡拉 OK、云终端、车载中控等行业。
动基础-进阶篇
进阶1 编译进内核的驱动系统是如何运行的?
在经过前面章节的学习后,相信大家已经对驱动有了一些自己的认识和理解,从本章开始将对一些驱动相关的进阶知识进行讲解。本章要研究的内容为编译进内核的驱动系统是如何运行的?
在驱动程序中,module_init 宏定义了驱动的入口函数,在模块加载时被内核自动调用,该宏定义在内核源码目录下的“include/linux/module.h”文件中,具体内容如下所示:
module_init的具体内容由MODULE宏定义来决定,该宏定义在内核源码的顶层Makefile中,具体为KBUILD_CFLAGS_KERNEL和KBUILD_CFLAGS_MODULE两个宏,如下所示:
由于本章节探究的是编译进内核的驱动,所以要看KBUILD_CFLAGS_KERNEL宏定义,该宏为空,那module_init 的宏定义具体内容如下所示:
注意:因为静态编译的驱动无法卸载,所以module_exit在编译进内核的驱动中并不会被执行!所以这里只是分析module_init。
然后继续向下查找__initcall的定义路径,该宏定义在内核源码目录下的“include/linux/init.h”文件中,具体内容如下所示:
#define __initcall(fn) device_initcall(fn)
接下来会发现该宏定义仍会套很多层宏定义,这些宏都在内核源码目录下的“include/linux/init.h”文件中,具体后续嵌套内容如下所示: