gpt4 book ai didi

linux - Linux 内核模块中的 module_init 和 init_module 有什么区别?

转载 作者:IT王子 更新时间:2023-10-28 23:59:54 47 4
gpt4 key购买 nike

我一直在尝试移植一些 linux 驱动程序,并意识到 linux 内核版本 2.4 和 2.6 之间存在很大差异。

在2.4版本内核中,模块编程如下-

#define MODULE
#include <linux/module.h>
#include <linux/kernel.h>

int init_module(void)
{
printk(KERN_INFO "Hi \n");
return 0;
}

void cleanup_module(void)
{
printk(KERN_INFO "Bye \n");
}

但是,对于 2.6 版本的内核,必须为模块完成以下操作 -

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

static int hi_init(void)
{
printk(KERN_ALERT "Hi \n");
return 0;
}

static void hi_exit(void)
{
printk(KERN_ALERT "Bye \n");
}

module_init(hi_init);
module_exit(hi_exit);

内核 2.6 中的此类更改有何优势?为什么 linux 内核 2.6 中需要进行此更改?

最佳答案

如果您查看新函数的定义:

/* Each module must use one module_init(). */
#define module_init(initfn) \
static inline initcall_t __inittest(void) \
{ return initfn; } \
int init_module(void) __attribute__((alias(#initfn)));

/* This is only required if you want to be unloadable. */
#define module_exit(exitfn) \
static inline exitcall_t __exittest(void) \
{ return exitfn; } \
void cleanup_module(void) __attribute__((alias(#exitfn)));

您会看到它确保包含正确的样板,以便编译器可以正确处理这些特殊函数。这就是 Linux 的内部 API 所做的,如果有更好的解决问题的方法,它就会发展。

关于linux - Linux 内核模块中的 module_init 和 init_module 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3218320/

47 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com