eda*_*els 1 c linux operating-system kernel kernel-module
我最近一直在研究这个问题并且已经查看了各种文章和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);
Run Code Online (Sandbox Code Playgroud)
我发现的一个可能原因是,这样做会增加将恶意代码注入正在运行的模块的难度.
另一个是命名空间不那么混乱,但这不仅仅是你正在链接和编译的内核模块的上下文中的问题吗?如果insmod实际上将代码链接到内核就像ld一样,那么我可以看到名称冲突如何搞乱系统.这是什么原因?
我想不出任何其他原因,我想在盲目开始使用约定之前澄清这一点.
先感谢您
如果编译器决定内联静态函数的所有被调用实例,则编译器不需要输出该函数的目标代码,因为它知道所有实例都已内联。但是,如果您不将其声明为静态,则编译器无法确定它不是从其他地方调用的。
此外,将某些内容声明为静态会阻止它进入全局名称空间。这在 C 中很重要,因为 C 没有名称修饰,因此只能有一个函数具有一个名称(即使它作用于不同的类型)。因此,您可以对静态函数使用短函数名称,因为知道它们不会与其他函数发生冲突。
没有任何特定于内核或操作系统的内容。只是良好的编程实践。