在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需要进行更改?
解决方法 如果你看一下新函数的定义:/* 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内核模块中module_init和init_module有什么区别?全部内容,希望文章能够帮你解决Linux内核模块中module_init和init_module有什么区别?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)