Linux   发布时间:2022-04-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Linux内核模块中module_init和init_module有什么区别?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

我一直在尝试移植一些 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有什么区别?所遇到的程序开发问题。

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

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。