当前位置: 首页 > 面试题库 >

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

苏胤
2023-03-14
问题内容

我一直在尝试移植一些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的作用,如果有更好的解决方法,它就会发展。



 类似资料:
  • 问题内容: b / w 和linux内核有什么区别?据说比这更安全,那为什么我们仍然使用? 在什么情况下我们应该使用:或? 问题答案: 这 似乎 到的情况是, raw表示本机字节顺序,非raw表示little-endian __前缀替代选项不包括内存障碍 请参阅此LKML讨论以及linux / arch / arm / include / asm / io.h中 的注释

  • 主要内容:initramfe虚拟文件系统GRUB 加载了内核之后,内核首先会再进行二次系统的自检,而不一定使用 BIOS 检测的硬件信息。这时内核终于开始替代 BIOS 接管 Linux 的启动过程了。 内核完成再次系统自检之后,开始采用动态的方式加载每个硬件的模块,这个动态模块大家可以想象成硬件的驱动(默认 Linux 硬件的驱动是不需要手工安装的,如果是重要的功能,则会直接编译到内核当中;如果是非重要的功能,比如硬件驱动会编译为模块

  • 问题内容: 我正在为Linux内核编写模块,并且我想在init函数中创建一些设备节点 我还希望内核为我的第一个节点分配一个次要编号,然后由我自己分配其他节点的次要编号。 我该如何在代码中做到这一点。我不想使用mknod从外壳创建设备 问题答案: 要更好地控制设备编号和设备创建,您可以执行以下步骤(而不是): 致电以获取一个主要号码和一系列次要号码。 使用创建设备类的设备。 对于每个设备,调用并将字

  • MANAGING THE LINUX KERNEL AND LOADABLE KERNEL MODULES 所有操作系统至少由两个主要组件组成。其中第一个也是最重要的是内核。 内核位于操作系统的中心,控制着操作系统所做的一切,包括管理内存,控制 CPU,甚至控制用户在屏幕上看到的内容。操作系统的第二个元素通常被称为用户区域,几乎包括其他所有元素。 内核被设计成一个受保护或特权的区域,只能由 roo

  • 我有Java的背景,我是Python的新手。在继续之前,我想确保我正确理解Python术语。 我对模块的理解是:一个可以由许多脚本导入的脚本,以便于阅读。就像在java中一样,您有一个类,该类可以由许多其他类导入。 我对库的理解是:库包含许多模块,这些模块因其用途而相互分离。 我的问题是:图书馆就像包裹一样,你有一个包裹,例如叫做食物的包裹,那么: 巧克力。py 糖果。py 比斯切茨。py公司 是

  • 主要内容:内核模块保存位置与模块保存文件,内核模块的查看,内核模块的添加与删除Linux 的内核会在启动过程中自动检验和加载硬件与文件系统的驱动。一般这些驱动都是用模块的形式加载的,使用模块的形式保存驱动,可以不直接把驱动放入内核,有利于控制内核大小。 模块的全称是 动态可加载内核模块,它是具有独立功能的程序,可以被单独编译,但不能独立运行。模块是为内核或其他模块提供功能的代码集合。这些模块可以是 Linux 源码中自带的,也可以是由硬件厂商开发的(可以想象成驱动)。不过内