如何通过内核在文件外部调用模块中的静态init和exit函数?

时间:2016-10-20 05:52:37

标签: c linux linux-kernel driver

我正在阅读LDD3并对__init和__exit函数调用中静态存储类的使用存有疑问。 http://static.lwn.net/images/pdf/LDD3/ch02.pdf

  

“初始化函数应声明为静态,因为它们是   并不意味着在特定文件之外可见;没有难的   但是,关于这一点的规则,因为没有函数被导出到其余部分   内核除非明确要求“

但是内核能够使用insmod和rmmod系统调用来使用init和exit函数。如果静态函数是仅对同一文件中的其他函数可见的函数,那么内核如何能够在我们的模块中使用__init和__exit函数定义static?

2 个答案:

答案 0 :(得分:0)

一个翻译单元中的静态函数可以通过函数指针等后门导出。动态链接使用相同的方法。

在您的驱动程序代码中,您还必须编写

module_init(__ init_function_name __)和module_exit( exit_function_name )。

您可能会看到这些宏是如何实现的。

答案 1 :(得分:0)

技术上在C中,通过在一个文件中导出静态函数的函数指针并使用extern函数指针从另一个文件调用它们是可能的。许多像Linux内核这样的框架都在做同样的事情。

module_inint(your_func);

module_init是一个宏,它会扩展,使得your_func的函数指针被添加到一个数组中。在启动时或模块加载时被调用。

关于module_init()的一个很好的解释是https://stackoverflow.com/a/18606561/775964