Linux 如何从内核代码调用内核模块(LKM)中定义的函数?

Linux 如何从内核代码调用内核模块(LKM)中定义的函数?,linux,linux-kernel,kernel-module,Linux,Linux Kernel,Kernel Module,我是内核开发技术的新手。我想知道,一旦动态加载内核模块,是否有办法在内核和内核模块(LKM)之间建立通信。我想做的是在内核模块等待数据时,从内核的特定部分调用函数来发送数据。如果模块还没有加载,我想这会引起一些麻烦,因为函数还没有定义。所以我的问题是,有一种方法可以从内核的某个地方调用在内核模块上定义的函数吗?我找不到这个问题的任何来源,所以我也想问你,我正在尝试做的是不是一种不好的做法,是否有其他方法可以做到这一点 这就是我想做的: 我在LKM上有一个名为“foo(mesg)”的函数 我希望

我是内核开发技术的新手。我想知道,一旦动态加载内核模块,是否有办法在内核和内核模块(LKM)之间建立通信。我想做的是在内核模块等待数据时,从内核的特定部分调用函数来发送数据。如果模块还没有加载,我想这会引起一些麻烦,因为函数还没有定义。所以我的问题是,有一种方法可以从内核的某个地方调用在内核模块上定义的函数吗?我找不到这个问题的任何来源,所以我也想问你,我正在尝试做的是不是一种不好的做法,是否有其他方法可以做到这一点

这就是我想做的:

  • 我在LKM上有一个名为“foo(mesg)”的函数
  • 我希望在“arch/x86/mm/fault.c”代码中调用此函数“foo”
  • 其目的是存储这些“MESG”,然后使用/proc在用户空间中收集它们。这就是为什么我要建立一个LKM

不能直接从用户空间调用函数到内核模块(与libc调用类似,除非内核模块实现新的系统调用)。但是,您可以调用内核中实现的任何函数或已导出的其他模块。(导出符号()

如果您想获得更多帮助,最好更具体地说明内核模块的功能

所以我的问题是,有一种方法可以调用上定义的函数 从内核上的某个地方获取内核模块

您可以通过在模块中创建回调函数并使用其地址调用它来实现。 您需要创建一个函数,该函数在
arch/x86/mm/fault.c
中接收并本地存储方法指针,并使用
export\u SYMBOL
将其导出,我们将其称为“init\u foo(void*fn\u ptr)”


在模块中,创建回调函数并调用
init\u foo
to。现在,当您想要调用回调函数时,只需先检查是否有它的地址
(!=null)
,如果有,然后使用它来调用回调函数。

因此,我更改了代码“arch/x86/mm/fault.c”中放置函数“foo(mesg)”的特定部分。我想用这里定义的函数“foo”实现我的LKM,为了接收到每个“mesg”,我将它存储在数据结构中。LKM将有一个使用/proc与守护进程的接口,以便将收集的数据外部化到用户级别。我想不出在哪里插入“EXPORT\u SYMBOL”就行了。@Vinicius
EXPORT\u SYMBOL(foo)
应该紧跟在函数定义之后。查看代码中其他符号是如何导出的示例。