【发布时间】:2016-05-22 12:26:34
【问题描述】:
我写了一个LKM(可加载内核模块),需要调用/linux/driver下另一个内核驱动模块中的函数。我不知道如何将这些功能导入 LKM。由于 /lib/modules/linux/ (作为 make -C 选项)不包含内核驱动程序的头文件,我不能直接将它们作为头文件包含在内。有什么办法吗?
【问题讨论】:
标签: linux linux-kernel
我写了一个LKM(可加载内核模块),需要调用/linux/driver下另一个内核驱动模块中的函数。我不知道如何将这些功能导入 LKM。由于 /lib/modules/linux/ (作为 make -C 选项)不包含内核驱动程序的头文件,我不能直接将它们作为头文件包含在内。有什么办法吗?
【问题讨论】:
标签: linux linux-kernel
基本上,如果驱动程序使用源代码中的EXPORT 宏显式导出函数,则只能从另一个模块或内核调用函数。
您到底想到了哪个内核驱动程序?你不能把代码复制到你的驱动程序吗?
【讨论】:
a) 正如@stdcall 指出的 reg 宏,宏名称实际上是 EXPORT_SYMBOL 和 EXPORT_SYMBOL_GPL
b) 注册您想使用的特定调用,我发现这是内核版本 4.6 上最接近的匹配:arch/x86/include/asm/xen/hypercall.h
208 static inline long
209 privcmd_call(unsigned call,
210 unsigned long a1, unsigned long a2,
211 unsigned long a3, unsigned long a4,
212 unsigned long a5)
...
调用是“静态的”并且不是导出的;因此你不能在 LKM 中使用它。
c) 正如@stdcall 指出的那样,您可以尝试复制它,但根据我的经验,这并不总是可行,因为可能存在太多依赖项。 有些事情是故意只在内联树中完成的,而不是作为内核模块..
【讨论】: