C中的内核模块\uuu init宏

C中的内核模块\uuu init宏,c,linux-kernel,macros,C,Linux Kernel,Macros,我想为Linux创建一个可加载的内核模块。 这是密码 #include <linux/module.h> #include <linux/init.h> static int __init mymodule_init(void) { printk ("My module worked!\n"); return 0; } static void __exit mymodule_exit(void) { printk ("Unloading my mo

我想为Linux创建一个可加载的内核模块。 这是密码

#include <linux/module.h>
#include <linux/init.h>

static int __init mymodule_init(void)
{
 printk ("My module worked!\n");
        return 0;
}

static void __exit mymodule_exit(void)
{
 printk ("Unloading my module.\n");
        return;
}

module_init(mymodule_init);
module_exit(mymodule_exit);

MODULE_LICENSE("GPL");
#包括
#包括
静态int\uu init mymodule\u init(void)
{
printk(“我的模块工作!\n”);
返回0;
}
静态无效\uuu退出mymodule\u退出(无效)
{
printk(“卸载我的模块。\n”);
返回;
}
模块_init(mymodule_init);
模块退出(我的模块退出);
模块许可证(“GPL”);
现在请注意
\u init
宏。正如医生所说:

__init宏向编译器指示关联的函数 仅在初始化期间使用。编译器将所有代码标记为 将_init放入一个特殊的内存段,该内存段在 初始化


我试图理解为什么初始化方法最终会泄漏内存。这是由于堆栈中函数调用的FIFO配置造成的吗?

非常宽泛:

可执行代码(编译成的源代码)占用内存。现代CPU将读取指令所在的内存部分并执行它们。对于大多数用户空间应用程序,进程内存的代码段只加载一次,并且在程序执行期间从不更改。代码总是存在的,除非程序员玩弄它

这不是问题,因为操作系统将管理进程虚拟内存,冷代码段最终将卸载到交换文件中。物理内存永远不会像用户空间那样被“浪费”

对于内核,代码在特权模式下运行,不会像在用户模式下那样“卸载”未使用的页面。如果一个函数被放入内核的常规代码段,它将占用物理内存,直到内核运行,这可能需要相当长的时间。如果一个函数只被调用一次,那是相当浪费空间的

现在,虽然可加载内核模块通常可以加载和卸载,因此它们的代码可能不会无限期地占用空间,但对于只调用一次的函数来说,占用空间仍然有些浪费


由于现代CPU将代码视为可执行数据的一种形式,所以可以将该数据放入一个不会无限期保留的内存段中。该函数被加载,然后被调用,然后该段可以用于其他内容。这是
\uu init
宏指示编译器执行的操作。发出调用后可以轻松卸载的代码。

上面引用的什么表示内存泄漏?需要将u init方法放在一个特殊的内存部分“…初始化后释放”?对我来说,这似乎不是一个漏洞。这是由于堆栈中函数调用的FIFO处理——什么?堆栈甚至不是FIFO结构。你太棒了,谢谢。内核内存不可交换的原因是什么?ps:在用户进程中,是占用内存的代码还是堆栈中的函数调用?@Tantaros-调用堆栈不包含代码,它包含调用变量和返回指令指针(以及其他内容)。该指针是可执行代码中的一个位置。代码在另一段中与堆栈本身分离。至于不受交换影响的内核,这是一个可以避免的复杂问题。