iis服务器助手广告广告
返回顶部
首页 > 资讯 > 操作系统 >linux中引入模块机制的好处是什么
  • 768
分享到

linux中引入模块机制的好处是什么

linux 2023-04-21 05:04:17 768人浏览 独家记忆
摘要

本文小编为大家详细介绍“linux中引入模块机制的好处是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“linux中引入模块机制的好处是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学

本文小编为大家详细介绍“linux中引入模块机制的好处是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“linux中引入模块机制的好处是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

linux中引入模块机制的好处:1、应用程序在退出时,可以不管资源的释放或者其他的清除工作,但是模块的退出函数却必须仔细此撤销初始化函数所作的一切;2、该机制有助于缩短模块的开发周期,即注册和卸载都很灵活方便。

Linux中引入模块机制有什么好处?

首先,模块是预先注册自己以便服务于将来的某个请求,然后他的初始化函数就立即结束。换句话说,模块初始化函数的任务就是为以后调用函数预先作准备。

好处:

  • 1) 应用程序在退出时,可以不管资源的释放或者其他的清除工作,但是模块的退出函数却必须仔细此撤销初始化函数所作的一切。

  • 2) 该机制有助于缩短模块的开发周期。即:注册和卸载都很灵活方便。

Linux模块机制浅析

Linux允许用户通过插入模块,实现干预内核的目的。一直以来,对linux的模块机制都不够清晰,因此本文对内核模块的加载机制进行简单地分析。

模块的Hello World!

我们通过创建一个简单的模块进行测试。首先是源文件main.c和Makefile。

florian@florian-pc:~/module$ cat main.c

#include<linux/module.h>
#include<linux/init.h>

static int __init init(void)
{
   printk("Hi module!\n");
   return 0;
}

static void __exit exit(void)
{
   printk("Bye module!\n");
}

module_init(init);
module_exit(exit);

其中init为模块入口函数,在模块加载时被调用执行,exit为模块出口函数,在模块卸载被调用执行。

florian@florian-pc:~/module$ cat Makefile

obj-m += main.o
#generate the path
CURRENT_PATH:=$(shell pwd)
#the current kernel version number
LINUX_KERNEL:=$(shell uname -r)
#the absolute path
LINUX_KERNEL_PATH:=/usr/src/linux-headers-$(LINUX_KERNEL)
#complie object
all:
   make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules
#clean
clean:
   make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean

其中,obj-m指定了目标文件的名称,文件名需要和源文件名相同(扩展名除外),以便于make自动推导。

然后使用make命令编译模块,得到模块文件main.ko。

florian@florian-pc:~/module$ make

make -C /usr/src/linux-headers-2.6.35-22-generic M=/home/florian/module modules
make[1]: 正在进入目录 `/usr/src/linux-headers-2.6.35-22-generic'
 Building modules, stage 2.
 MODPOST 1 modules
make[1]:正在离开目录 `/usr/src/linux-headers-2.6.35-22-generic'

使用insmod和rmmod命令对模块进行加载和卸载操作,并使用dmesg打印内核日志

florian@florian-pc:~/module$ sudo insmod main.ko;dmesg | tail -1
[31077.810049] Hi module!
florian@florian-pc:~/module$ sudo rmmod main.ko;dmesg | tail -1
[31078.960442] Bye module!

通过内核日志信息,可以看出模块的入口函数和出口函数都被正确调用执行。

模块文件

使用readelf命令查看一下模块文件main.ko的信息。

florian@florian-pc:~/module$ readelf -h main.ko

ELF Header:
 Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
 Class:                             ELF32
 Data:                              2's complement, little endian
 Version:                           1 (current)
 OS/ABI:                            UNIX - System V
 ABI Version:                       0
 Type:                              REL (Relocatable file)
 Machine:                           Intel 80386
 Version:                           0x1
 Entry point address:               0x0
 Start of program headers:          0 (bytes into file)
 Start of section headers:          1120 (bytes into file)
 Flags:                             0x0
 Size of this header:               52 (bytes)
 Size of program headers:           0 (bytes)
 Number of program headers:         0
 Size of section headers:           40 (bytes)
 Number of section headers:         19
 Section header string table index: 16

我们发现main.ko的文件类型为可重定位目标文件,这和一般的目标文件格式没有任何区别。我们知道,目标文件是不能直接执行的,它需要经过链接器的地址空间分配、符号解析和重定位的过程,转化为可执行文件才能执行。

那么,内核将main.ko加载后,是否对其进行了链接呢?

模块数据结构

首先,我们了解一下模块的内核数据结构

linux3.5.2/kernel/module.h:220

struct module
{
   ……
   
   int (*init)(void);
   ……
   
   void (*exit)(void);
   ……
};

模块数据结构的init和exit函数指针记录了我们定义的模块入口函数和出口函数。

模块加载

模块加载由内核的系统调用init_module完成。

linux3.5.2/kernel/module.c:3009


SYSCALL_DEFINE3(init_module, void __user *, umod,
      unsigned long, len, const char __user *, uargs)
{
   struct module *mod;
   int ret = 0;
   ……
   
   mod = load_module(umod, len, uargs);//模块加载
   ……
   
   if (mod->init != NULL)
      ret = do_one_initcall(mod->init);//模块init函数调用
   ……
   return 0;
}

系统调用init_module由SYSCALL_DEFINE3(init_module...)实现,其中有两个关键的函数调用。load_module用于模块加载,do_one_initcall用于回调模块的init函数。

函数load_module的实现为。

linux3.5.2/kernel/module.c:2864


static struct module *load_module(void __user *umod,
               unsigned long len,
               const char __user *uargs)
{
   struct load_info info = { NULL, };
   struct module *mod;
   long err;
   ……
   
   err = copy_and_check(&info, umod, len, uargs);//拷贝到内核
   if (err)
      return ERR_PTR(err);
   
   mod = layout_and_allocate(&info);//地址空间分配
   if (IS_ERR(mod)) {
      err = PTR_ERR(mod);
      Goto free_copy;
   }
   ……
   
   err = simplify_symbols(mod, &info);//符号解析
   if (err < 0)
      goto free_modinfo;
   err = apply_relocations(mod, &info);//重定位
   if (err < 0)
      goto free_modinfo;
   ……
}

函数load_module内有四个关键的函数调用。copy_and_check将模块从用户空间拷贝到内核空间,layout_and_allocate为模块进行地址空间分配,simplify_symbols为模块进行符号解析,apply_relocations为模块进行重定位。

由此可见,模块加载时,内核为模块文件main.ko进行了链接的过程!

至于函数do_one_initcall的实现就比较简单了。

linux3.5.2/kernel/init.c:673

int __init_or_module do_one_initcall(initcall_t fn)
{
   int count = preempt_count();
   int ret;
   if (initcall_debug)
      ret = do_one_initcall_debug(fn);
   else
      ret = fn();//调用init module
   ……
   return ret;
}

即调用了模块的入口函数init。

模块卸载

模块卸载由内核的系统调用delete_module完成。

linux3.5.2/kernel/module.c:768

SYSCALL_DEFINE2(delete_module, const char __user *, name_user,
       unsigned int, flags)
{
   struct module *mod;
   char name[MODULE_NAME_LEN];
   int ret, forced = 0;
   ……
   
   if (mod->exit != NULL)
      mod->exit();//调用exit module
   ……
   free_module(mod);//卸载模块
   ……
}

通过回调exit完成模块的出口函数功能,最后调用free_module将模块卸载。

读到这里,这篇“linux中引入模块机制的好处是什么”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程服务器栏目。

--结束END--

本文标题: linux中引入模块机制的好处是什么

本文链接: https://www.lsjlt.com/news/201742.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • linux中引入模块机制的好处是什么
    本文小编为大家详细介绍“linux中引入模块机制的好处是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“linux中引入模块机制的好处是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学...
    99+
    2023-04-21
    linux
  • Node的模块机制是什么
    这篇文章主要介绍“Node的模块机制是什么”,在日常操作中,相信很多人在Node的模块机制是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Node的模块机制是什么”的疑惑...
    99+
    2022-10-19
  • Node.js模块查找,引用及缓存机制是什么
    这篇文章主要介绍“Node.js模块查找,引用及缓存机制是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Node.js模块查找,引用及缓存机制是什么”文章能帮助大家解决问题。1. Node.js...
    99+
    2023-07-05
  • Node.js中Nestjs框架的模块机制是什么
    这篇文章主要介绍“Node.js中Nestjs框架的模块机制是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Node.js中Nestjs框架的模块机制是什么”文...
    99+
    2022-10-19
  • Node.js中模块加载机制的原理是什么
    这期内容当中小编将会给大家带来有关Node.js中模块加载机制的原理是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。简单例子老规矩,讲原理前我们先来一个简单的例子,从...
    99+
    2022-10-19
  • Node.js内置模块的运行机制是什么
    今天小编给大家分享一下Node.js内置模块的运行机制是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。内置模块一些栗子F...
    99+
    2023-07-04
  • linux中内核模块指的是什么
    本文小编为大家详细介绍“linux中内核模块指的是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“linux中内核模块指的是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。在linux中,内核模块是linu...
    99+
    2023-06-29
  • Node.js的模块化机制和Buffer对象是什么
    本篇内容主要讲解“Node.js的模块化机制和Buffer对象是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Node.js的模块化机制和Buffer对象是什么”吧!一、Node.js的模块...
    99+
    2023-06-29
  • JS中的模块导入缺点是什么
    这篇文章主要介绍“JS中的模块导入缺点是什么”,在日常操作中,相信很多人在JS中的模块导入缺点是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JS中的模块导入缺点是什么”...
    99+
    2022-10-19
  • Python中导入模块的搜索顺序是什么
    Python中导入模块的搜索顺序是什么?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。python是什么意思Python是一种跨平台的、具有解释性、编译性、互动性和面向对象的脚本...
    99+
    2023-06-14
  • Linux系统中的SysVinit机制是什么
    本篇内容主要讲解“Linux系统中的SysVinit机制是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux系统中的SysVinit机制是什么”吧!SysV init是systemV风...
    99+
    2023-06-13
  • JS中导入模块import和require的区别是什么
    这篇文章主要介绍“JS中导入模块import和require的区别是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JS中导入模块import和require的区别是什么”文章能帮助大家解决问题。...
    99+
    2023-07-05
  • PHP中的异常处理机制是什么?
    PHP是一种开源脚本语言,广泛应用于Web开发中。它有一个强大的异常处理机制,有助于开发人员更好地捕获并处理程序中的错误和异常。一、什么是异常?在编写程序时,会发生各种错误,比如无法找到文件、变量类型不匹配、数组越界等等。这些错误也称为异常...
    99+
    2023-05-14
    机制 PHP 异常处理
  • PHP中的错误处理机制是什么?
    PHP是一种流行而强大的服务器端编程语言,可以用来开发各种Web应用程序。就像其他编程语言一样,PHP也有可能会出现错误和异常。这些错误和异常可能由各种原因引起,如程序错误、服务器错误、用户输入错误等等。为了确保程序的运行稳定性和可靠性,P...
    99+
    2023-05-14
    PHP错误处理 异常处理 错误日志记录
  • Struts2中的异常处理机制是什么
    这期内容当中小编将会给大家带来有关Struts2中的异常处理机制是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。声明式异常捕捉Struts2的异常处理机制是通过在struts.xml文件中配置<...
    99+
    2023-05-31
    struts2 st 异常处
  • .NET4中异常处理的新机制是什么
    本篇内容介绍了“.NET4中异常处理的新机制是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在.NET 4.0之后,CLR将会区别出一些...
    99+
    2023-06-17
  • PostgreSQL中空闲数据块管理机制的原理是什么
    本篇文章给大家分享的是有关PostgreSQL中空闲数据块管理机制的原理是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。数据块空闲空间的产...
    99+
    2022-10-18
  • java中异常处理机制的原理是什么
    Java中的异常处理机制是基于异常类的继承关系和异常处理代码块的机制。当程序发生异常时,会抛出一个异常对象,该异常对象会沿着调用链向...
    99+
    2023-08-31
    java
  • ASP文件在Linux系统中的运作机制是什么?
    ASP(Active Server Pages)是一种动态网页技术,它可以让网站服务器生成动态网页内容。ASP文件通常运行在Windows操作系统的IIS(Internet Information Services)上,但是在Linux系...
    99+
    2023-10-03
    linux apache 文件
  • 计算机中符合结构化程序设计要求的模块应该是什么
    这篇文章主要介绍计算机中符合结构化程序设计要求的模块应该是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!符合结构化程序设计要求的模块应该是使用顺序、选择和重复(循环)三种基本控制结构表示程序的控制逻辑。结构化程序...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作