我一直在尝试移植一些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中需要进行此更改?
如果您查看新功能的定义:
/* 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的作用,如果有更好的解决方法,它就会发展。