一文搞懂内核模块依赖

2023-05-09 13:17:22    来源 : 面包芯语


(资料图片仅供参考)

不知大家有没有想过,在一个内核模块代码中,会用到printk函数,而这个函数不是我们实现的,它是内核代码的一部分,但我们为什么能够编译通过呢?

我们的代码之所以能够编译通过,是因为对模块的编译仅仅是编译,并没有链接。

printk的 符号类型是U,表示它是一个未决符号。意思是说在编译阶段不知道这个符号的地址,因为它被定义在其他文件中,没有放在模块代码一起编译。

1、EXPORT_SYMBOL导出符号

2、内核模块依赖

#include#include#includeexternintexpval;externvoidexpfun(void);staticint__initvser_init(void){printk("vser_init\");printk("expval:%d\n",expval);expfun();return0;}staticvoid__exitvser_exit(void){printk("vser_exit\n");}module_init(vser_init);module_exit(vser_exit);

dep.c

#include#includestaticintexpval=5;EXPORT_SYMBOL(expval);staticvoidexpfun(void){printk("expfun");}EXPORT_SYMBOL_GPL(expfun);

Makefile关键处:

obj-m:=vser.oobj-m+=dep.o

上述代码中,dep.c定义了一个变量expval和一个函数expfun,并分别用EXPORT_SYMBOLEXPORT_SYMBOL_GPL导出。而vser.c里则调用了dep.c的变量和函数,编译安装后:

#modprobevser#dmesg[58278.204677]vser_init[58278.204683]expval:5[58287.206464]expfun

从输出信息中可以看到,vser.c正确引用到了dep.c的变量和函数。

#cat/lib/modules/5.10.111-64-generic/modules.dep......extra/vser.ko:extra/dep.koextra/dep.ko:
WARNING:"expfun"[/home/ubuntu/driver/module/vser.ko]undefined!WARNING:"expval"[/home/ubuntu/driver/module/vser.ko]undefined!#sudoinsmoddep.ko#sudoinsmodvser.koinsmod:errorinserting"vser.ko":-1Invalidparameters

这是因为在编译vser模块时在内核的符号表中找不到expvalexpfun的项,而vser模块又完全不知道dep模块的存在。

内核将会创建模块依赖关系的链接,只有当依赖于这个模块的链表为空时,模块才能被卸载。

标签:

相关推荐

x 广告

如有意见请与我们联系 邮箱:8 97 180 9 @qq.com

豫ICP备2021032478号-31

Copyright ©  2015-2022 元宇宙版权所有