11

我一直在尝试移植一些 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 中需要进行更改?

4

3 回答 3

8

如果你看一下新函数的定义:

/* 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 所做的,如果有更好的方法来解决问题,它就会发展。

于 2010-07-10T14:25:35.310 回答
5

Kernel 2.6 中的 [module_init] 有什么好处

module_init请注意,在 2.4 中也已退出。

它添加了必要的样板来初始化模块并在模块文件编译到内核而不是作为模块时运行入口函数。

于 2010-11-21T14:41:28.530 回答
1

一个优点是可读性。cdrom_init() 立即告诉您这是对 cdrom 驱动程序的 init() 调用。

于 2010-07-11T14:02:28.313 回答