【问题标题】:Why is it a convention to use static functions in a LKM为什么在 LKM 中使用静态函数是一种约定
【发布时间】:2013-10-09 13:21:04
【问题描述】:

我最近一直在研究这个问题,并查看了各种文章和 stackoverflow 帖子,但我似乎无法找到一个直接的答案。在创建内核模块时,我看到大多数代码如下所示:

#include <linux/init.h>
static int test_init(void) {return 0;}
static void test_exit(void) {;}
module_init(test_init);
module_exit(test_exit);
  • 我发现的一个可能原因是这样做会增加将恶意代码注入正在运行的模块的难度。

  • 另一个是命名空间不那么混乱,但这不只是在您正在链接和编译的内核模块的上下文中存在的问题吗?如果insmod 真的像 ld 那样将代码链接到内核中,那么我可以看到名称冲突会如何扰乱系统。是这个原因吗?

我想不出任何其他原因,我希望在我盲目开始使用约定之前澄清这一点。

提前谢谢你

【问题讨论】:

    标签: c linux operating-system kernel kernel-module


    【解决方案1】:

    如果在 .c 文件之外不需要函数,则应在该 .c 文件中将其声明为静态。

    这只是很好的封装。

    它避免了名称冲突并让读者知道您的意图。

    【讨论】:

      【解决方案2】:

      如果编译器决定内联静态函数的所有调用实例,则编译器不需要输出该函数的目标代码,因为它知道所有实例都已内联。但是,如果您不将其声明为静态,则编译器无法确定它不是从其他地方调用的。

      此外,将某些内容声明为静态会阻止其进入全局名称空间。这在没有名称修饰的 C 中很重要,因此只能有一个具有同一个名称的函数(即使它作用于不同的类型)。因此,您可以为静态函数使用短函数名称,因为它们不会与其他任何人发生冲突。

      没有特定于内核或操作系统的内容。只是良好的编程习惯。

      【讨论】:

      • 那么,如果链接到内核产生冲突(但在编译时没有发现冲突),这是一个问题吗?
      • 如果您编译为内置对象而不是模块,则可能会出现问题。大多数内核模块都可以。但请注意最后一句话:这不是特定于内核的任何东西,它只是标准的编程实践。内核及其模块可能会减少这种必要性,而不是更多。但不太必要并不意味着没有必要。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-05
      • 1970-01-01
      • 2012-11-11
      • 1970-01-01
      • 2020-11-02
      • 2011-08-13
      相关资源
      最近更新 更多