Linux内核模块中module_init和init_module有什么区别?
发布时间:2020-12-14 02:21:56 所属栏目:Linux 来源:网络整理
导读:我一直在尝试移植一些 Linux驱动程序,并意识到 Linux的内核版本2.4和2.6之间存在很大差异. 在2.4版本的内核中,模块编程如下 – #define MODULE#include linux/module.h#include linux/kernel.hint init_module(void) { printk(KERN_INFO "Hi n"); return 0;
我一直在尝试移植一些
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需要进行更改? 解决方法
如果你看一下新函数的定义:
/* 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所做的,如果有更好的方法来解决问题,它就会发展. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |