【问题标题】:How static init and exit functions in a module are called outside the file by the kernel?内核如何在文件外调用模块中的静态 init 和 exit 函数?
【发布时间】:2016-10-20 05:52:37
【问题描述】:

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

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

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

【问题讨论】:

  • 基本上它是通过链接器完成的。特殊的pragma 将这些函数放在对象中的某个部分。核心代码在模块即将初始化的部分寻找那些函数,

标签: c linux linux-kernel driver


【解决方案1】:

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

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

module_init(__init_function_name__) 和 module_exit(exit_function_name)。

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

【讨论】:

  • "在您的驱动程序代码中..." -- 并非每个可加载模块都是驱动程序。
【解决方案2】:

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


module_inint(your_func);

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

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

【讨论】:

    猜你喜欢
    • 2013-06-02
    • 2011-02-06
    • 1970-01-01
    • 1970-01-01
    • 2016-04-29
    • 2014-10-19
    • 2018-10-22
    • 1970-01-01
    • 2011-11-13
    相关资源
    最近更新 更多