我一直试图移植一些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);
Kernel 2.6中此类更改的优势是什么?为什么Linux内核2.6需要进行更改?
答案 0 :(得分: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所做的事情,如果有更好的方法来解决问题,它就会发展。
答案 1 :(得分:5)
内核2.6中[module_init]的优点是什么
module_init
也在2.4中退出,请注意。
它添加了必要的样板来初始化模块并在模块文件编译到内核而不是模块时运行入口函数。
答案 2 :(得分:1)
一个优点是可读性。 cdrom_init()立即告诉你它是cdrom驱动程序的init()调用。