天天快资讯丨KO之间互相调用
2023-05-21 20:27:36 博客园
需求

假设有两个KO,命名为moduleA.KO,moduleB.KO,现在要实现在moduleB.KO中调用moduleA.KO中的函数。


(资料图)

实现ModuleA实现

源码:

#include #include #include void moduleA_func(void){    printk("moduleA function\r\n");}static int __init moduleA_init(void){    printk("moduleA init!\r\n");    return 0;}static void __exit moduleA_exit(void){    printk("moduleA exit!\r\n");}EXPORT_SYMBOL_GPL(moduleA_func);MODULE_AUTHOR("moduleA");MODULE_DESCRIPTION("moduleA functions");MODULE_LICENSE("GPL v2");module_init(moduleA_init);module_exit(moduleA_exit);

moduleA导出符号moduleA_func。

编译Makefile实现:

# Kernel modulesobj-m += moduleA.oKVERS = $(shell uname -r)# Specify flags for the module compilation.#EXTRA_CFLAGS=-g -O0OUTPUT_DIR := $(shell pwd)build: kernel_moduleskernel_modules:make -C /lib/modules/$(KVERS)/build M=$(OUTPUT_DIR) modulesclean:make -C /lib/modules/$(KVERS)/build M=$(OUTPUT_DIR) clean

编译:

$ make$ more Module.symvers0xcaecb33a      moduleA_func    /home/grace/ko_test/moduleA/moduleA     EXPORT_SYMBOL_GPL

可以看出,moduleA_func已经在导出的符号表中了。

ModuleB实现

源码:

#include #include #include extern void moduleA_func(void);static int __init moduleB_init(void){    printk("moduleB init!\r\n");    moduleA_func();    return 0;}static void __exit moduleB_exit(void){    printk("moduleB exit!\r\n");}MODULE_AUTHOR("moduleB");MODULE_DESCRIPTION("moduleB functions");MODULE_LICENSE("GPL v2");module_init(moduleB_init);module_exit(moduleB_exit);

编译Makefile:

# Kernel modulesobj-m += moduleB.oKVERS = $(shell uname -r)# Specify flags for the module compilation.#EXTRA_CFLAGS=-g -O0# 引用moduleA.ko的符号表, 需要先编译SDK才能得到, 路径为绝对路径KBUILD_EXTRA_SYMBOLS += /home/grace/ko_test/moduleA/Module.symversOUTPUT_DIR := $(shell pwd)build: kernel_moduleskernel_modules:make -C /lib/modules/$(KVERS)/build M=$(OUTPUT_DIR) modulesclean:make -C /lib/modules/$(KVERS)/build M=$(OUTPUT_DIR) clean
测试

1、插入moduleA.ko

$ sudo insmod moduleA.ko$ sudo dmesg -c[ 1567.642413] moduleA: loading out-of-tree module taints kernel.[ 1567.642507] moduleA: module verification failed: signature and/or required key missing - tainting kernel[ 1567.642823] moduleA init!$ cat /proc/kallsyms | grep moduleA_funcffffffffc071b030 r __ksymtab_moduleA_func       [moduleA]ffffffffc071b07b r __kstrtab_moduleA_func       [moduleA]ffffffffc071b040 r __kcrctab_moduleA_func       [moduleA]ffffffffc071a000 t moduleA_func [moduleA]

2、插入moduleB.ko

$ sudo dmesg -c[ 1900.514577] moduleB init![ 1900.514580] moduleA function

可以看出,moduleB成功调用到了moduleA的moduleA_func函数。

常见错误

1、moduleA没有编译就编译了ModuleB

这时候会提示:WARNING: "moduleA_func" [/home/grace/ko_test/moduleB/moduleB.ko] undefined!

2、没有在ModuleB的Makefile中添加KBUILD_EXTRA_SYMBOLS

这时候会提示:WARNING: "moduleA_func" [/home/grace/ko_test/moduleB/moduleB.ko] undefined!

3、注意:KBUILD_EXTRA_SYMBOLS后面跟的是绝对路径

总结

ModuleB.ko调用ModuleA.ko的使用步骤:

先编译ModuleA.ko, 得到KO的符号表, 也就是Module.symvers文件再编译ModuleB.ko, 需要在Makefile中指定ModuleA.ko的符号表位置KBUILD_EXTRA_SYMBOLS+="符号表位置",并且使用绝对路径方式。插入时,需要先插入ModuleA.ko,再插入ModuleB.ko卸载时,需要先卸载ModuleB.ko,再卸载ModuleA.ko,否则会提示:rmmod: ERROR: Module moduleA is in use by: moduleB

热门推荐

文章排行

  1. 2023-05-21天天快资讯丨KO之间互相调用
  2. 2023-05-21高情商的撩人句子(暧昧歌词) 当前通讯
  3. 2023-05-21潍坊荣获全省电子商务高质量发展奖励!
  4. 2023-05-21每日快看:小李子《花月杀手》烂番茄96%新鲜:今年最好的电影
  5. 2023-05-21白水晶真假的鉴别方法_白水晶的含义
  6. 2023-05-21我国自主研制的某型号新一代战斗机 我国自主研制的某型新一代战斗机|全球热闻
  7. 2023-05-21用不要不要不要只要造句子六年级_不要不要不要只要怎么造句 世界快报
  8. 2023-05-21单片机的基本工作条件
  9. 2023-05-21吉他cm和弦图_吉他Cm和弦怎么按|天天最新
  10. 2023-05-21高空坠物致人死亡!5年未找到责任人,法院这样判
  11. 2023-05-21【世界快播报】王国之泪苹果刷新位置在哪
  12. 2023-05-21imds资料_IMDS是什么 全球速讯
  13. 2023-05-21每日头条!加快提升企业信用监管数据质量
  14. 2023-05-21全球即时:我国猕猴桃产量全球第一!凭实力“圈粉”,国产猕猴桃不输进口奇异果
  15. 2023-05-21来了!眉山阵雨或雷雨来了,个别地方可能出现冰雹!还有大风
  16. 2023-05-21花季指几岁到几岁之间_花季指几岁到几岁
  17. 2023-05-21环球最资讯丨coloros恢复模式安装升级文件在哪个文件夹_coloros恢复模式安装升级文件
  18. 2023-05-20全球最资讯丨对董卓欲废帝的看法_第一个出来反对董卓废帝的是谁
  19. 2023-05-20黑龙江紫金铜业公司召开2023年度大修动员会暨5月份安委会会议
  20. 2023-05-20天天时讯:上海市科委主任:制定专门政策举措凝聚社会资本,关注硬科技早期创业