Linux内核模块中module_init和init_module有什么区别?

Linux内核模块中module_init和init_module有什么区别?,第1张

概述我一直在尝试移植一些 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"); 我一直在尝试移植一些 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所做的,如果有更好的方法来解决问题,它就会发展.

总结

以上是内存溢出为你收集整理的Linux内核模块中module_init和init_module有什么区别?全部内容,希望文章能够帮你解决Linux内核模块中module_init和init_module有什么区别?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1033333.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存