【问题标题】:How can a LKM call a function of kernel driver?LKM如何调用内核驱动的函数?
【发布时间】:2016-05-22 12:26:34
【问题描述】:

我写了一个LKM(可加载内核模块),需要调用/linux/driver下另一个内核驱动模块中的函数。我不知道如何将这些功能导入 LKM。由于 /lib/modules/linux/ (作为 make -C 选项)不包含内核驱动程序的头文件,我不能直接将它们作为头文件包含在内。有什么办法吗?

【问题讨论】:

    标签: linux linux-kernel


    【解决方案1】:

    基本上,如果驱动程序使用源代码中的EXPORT 宏显式导出函数,则只能从另一个模块或内核调用函数。

    您到底想到了哪个内核驱动程序?你不能把代码复制到你的驱动程序吗?

    【讨论】:

    • 嗯,就是/linux/driver/xen下的privcmd,作为从userland发出hypercall的接口,但是不知道LKM怎么用。
    【解决方案2】:

    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 指出的那样,您可以尝试复制它,但根据我的经验,这并不总是可行,因为可能存在太多依赖项。 有些事情是故意只在内联树中完成的,而不是作为内核模块..

    【讨论】:

    • 这是一个很好的提示。但是,如何将结构参数转换为“unsigned long”?使用积分?
    猜你喜欢
    • 2014-10-19
    • 2012-02-28
    • 2018-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-13
    • 2013-10-14
    • 1970-01-01
    相关资源
    最近更新 更多