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

时间:2014-08-26 02:20:23

标签: linux linux-kernel kernel-module

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

这就是我想要做的事情:

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

2 个答案:

答案 0 :(得分:0)

您无法直接从用户空间向内核模块调用函数(与libc调用一样,除非您的内核模块实现新的系统调用)。但是,您可以调用内核中实现的任何函数或已导出的其他模块。 (EXPORT_SYMBOL())。

如果您想要获得更多帮助,那么如果您对内核模块的功能更具体,那么它是最好的。

答案 1 :(得分:0)

  

所以我的问题是,有一种方法可以调用定义在   内核模块上的某个内核模块?

您可以通过在模块中创建一个回调函数并使用其地址进行调用来实现。 您需要创建一个函数,该函数可以在arch/x86/mm/fault.c中接收并本地存储方法指针,并使用EXPORT_SYMBOL将其导出,然后将其称为“ init_foo(void * fn_ptr)”。

在您的模块中,创建您的回调函数,并向pass its address调用init_foo。现在,无论何时要调用回调函数,只需检查一下是否有其地址first (!= null),如果有,请使用它来调用回调函数。