一尘不染

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

linux

我一直在尝试移植一些Linux驱动程序,并且意识到内核版本2.4与2.6的Linux之间存在实质性差异。

在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中需要进行此更改?


阅读 899

收藏
2020-06-07

共1个答案

一尘不染

如果您查看新功能的定义:

/* 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的作用,如果有更好的解决方法,它就会发展。

2020-06-07