模块机制

AlanTu AlanTu     2022-10-16     665

关键词:

模块是内核的一部分(通常是设备驱动程序),按需动态装入模块可以保证内核达到最小并且使内核非常灵活。一旦装入一个Linux内核模块,那么它就像任何标准的内核代码一样成为内核的一部分,具有相同的权限和职责。一方面凡是由内核“移出”的所有符号都可以在模块中引用;另一方面,除了这个特意移出的符号及系统调用外,应用程序别无途径直接访问内核中的资源。

在应用程序界面上,内核通过4个系统调用支持可安装模块的动态安装和拆卸,它们是create_module(),init_module(),query_module(),以及delete_module()。通常,用户不需要直接跟这些系统调用大交道,而可以用系统提供的工具/sbin/insmod(插入模块)和/sbin/rmmode(移走模块)来安装和拆卸模块。当然,这两个工具最终还是要通过这些系统调用完成有关操作的。/sbin/insmod 所调用的函数流程如图所示:

 

内核空间和用户空间

普通程序和内核模块的不同:对于模块的可执行代码时目标代码,缺少了一个连接过程——而insmod程序完成了这个连接过程。

 

1 处理器保护级

在i386处理器上实现了四层保护级别,依次是0级、1级、2级和3级,其中0级特权最高,3级特权最低。无论何时处理器总是在一个级别上运行。如果需要访问高特权级别的存储空间,只能通过由处理器规定的一些特权门完成操作。一般在0级运行的是操作系统的内核部分;在3级运行的是应用程序部分。在最低级运行的时候,操作系统禁止对硬件的直接访问和对内核运行内存空间的未授权访问。

2 用户空间和内核空间权限

对应于在0级别运行的内核程序,它所在的内存空间是内核空间;对应于在3级运行的应用程序,它所指的内存空间是用户空间。Linux通过系统调用或硬件中断完成从用户到内核空间的转换。在进程上下文中执行系统调用的内核代码,系统调用就可以访问原来进程的上下文数据。

对中断来说,它并不存在于任何进程上下文中,而是由内核来运行的。对模块来说,它就是在系统的用户空间定义的,然后通过用户空间的程序insmod将它插入到内核空间中运行,可以像真正的内核一样充分利用0级特权的功能执行程序。从图可以看出,insmod通过create_module()和init_module()两个系统调用将一个模块运行的空间从用户级切换到内核级。rmmod通过delete_module()系统调用将一个模块从内核空间中移出。

3 内核态和用户态之间数据传递

在内核空间与用户空间存在数据的传递,下面的函数与宏定义在内核中对这种传递进行操作。

函数copy_to_user从内核空间把数据拷贝到用户空间,拷贝成功返回0,否则,返回不能被拷贝的字节数。其参数to表示在用户空间的目标地址,参数from是在内核空间的源地址,参数n是需要拷贝数据的长度。函数原型如下:

unsigned long copy_to_user(void __user *to,const void *from,unsigned long n);

函数copy_from_user从用户空间拷贝一块数据,参数to表示在内核空间的目标地址,参数from是在用户空间的源地址,参数n是需要拷贝数据的长度。拷贝成功返回0,否则,返回不能被拷贝的字节数。如果有些数据没拷贝,函数copy_from_user将填充0到请求的长度n,函数copy_from_user原型如下:

unsigned long copy_from_user(void *to,const void __user *from,unsigned long n);

模块的使用过程

模块的使用过程如下:

打开待安装模块并将其读入到用户空间,所谓“模块”就是经过编译但未经连接的.o文件。

模块中有一些在模块内部无法落实的符号(函数名或变量名),这些符号的引用必须连接到内核中的相应符号,也就是必须把这些符号在内核映像中的地址填入模块中需要访问这些符号的指令,以及数据结构中。为此,需要通过系统调用query_module()函数向内核询问这些符号在内核中的地址。如果内核允许“移出”这些符号的地址,就会返回有关的“符号表”。有些符号可能并不属于内核本身,而属于已经安装的其他模块。

取得了内核“移出”的符号表“以后,模块中所有的符号引用就得到落实。这部分操作与编译后的连接相似。不过,常规的”连接“常常是双向的,而现在只是在模块中引用内核里的符号或者某些已经安装的模块中的符号,而内核不能反过来引用这个待安装模块中的符号。从这个意义上说,模块与内核的连接时单向连接。

通过系统调用sys_init_module(),把用户空间中模块目标文件解析后装入内核空间,建立在sysfs文件系统中的模块对象,再调用模块中一个名为init_module()的函数。每个模块的init_module()函数负责向内核”登记”本模块的一些包含着函数指针的数据结构。完成这种登记后,模块与内核之间的连接(另一个方向上的连接)才算真正完成。

node.js的模块机制

模块加载过程:路径分析->文件定位->模块编译Node对引入过的模块都会进行缓存,以减少二次引入时的开销。缓存的是编译和执行之后的对象。require时对缓存中的模块是第一优先级的路径分析模块标识符:require的参数,按... 查看详情

npm模块安装机制简介

...自:http://www.ruanyifeng.com/blog/2016/01/npm-install.htmlnpm是Node的模块管理器,功能极其强大。它是Node获得成功的重要原因之一。正因为有了npm,我们只要一行命令,就能安装别人写好的模块。$npminstall本文介绍npm模块安装机制的细节,... 查看详情

模块机制

模块是内核的一部分(通常是设备驱动程序),按需动态装入模块可以保证内核达到最小并且使内核非常灵活。一旦装入一个Linux内核模块,那么它就像任何标准的内核代码一样成为内核的一部分,具有相同的权限和职责。一方... 查看详情

模块加载机制与包的加载机制

模块加载机制包是更好的组织功能的代码结构当前指定一个文件夹,会将文件夹内的index.js作为程序的入口  3如果当前目录下有一个和文件夹同名的文件,优先加载文件    1如果当前目录下有一个和文件夹同... 查看详情

深入浅出node模块机制

  一)CommonJs    1.1CommonJs模块定义  二)Node的模块实现    2.1模块分类    2.2路径分析和文件定位      2.2.1路径分析      2.2.2文件定位    2.3模块编译一)CommonJs 在CommonJs的官网上写着这... 查看详情

深入浅出node.js模块机制

模块分类Node.js有两种模块核心模块部分核心模块已经被直接加载进内存中,路径分析编译执行的步骤可以省略并且在路径分析中优先被判断,所以加载速度最快文件模块运行时动态加载,所以需要完整的路径分析文件定位和编... 查看详情

node模块引入与加载机制(代码片段)

Node模块引入与加载机制引入模块Node.js提供了exports和require两个对象,其中exports是模块公开的接口,require用于从外部获取一个模块的接口,即所获取模块的exports对象。在Node.js中,引入一个模块非常简单:1.创... 查看详情

python基础–使用别人代码的模块机制(代码片段)

Python基础–使用别人代码的模块机制前言模块导入模块代码总结代码总结小练习导入模块代码总结第三方模块安装模块WindowsmacOS示例小练习💫点击直接资料领取💫前言Python的模块为日常编程中许多问题提供了标准的解决... 查看详情

python基础–使用别人代码的模块机制(代码片段)

Python基础–使用别人代码的模块机制前言模块导入模块代码总结代码总结小练习导入模块代码总结第三方模块安装模块WindowsmacOS示例小练习💫点击直接资料领取💫前言Python的模块为日常编程中许多问题提供了标准的解决... 查看详情

angularjs1笔记-(20)-模块化加载机制seajs

SeaJS是一个遵循CMD规范的JavaScript模块加载框架,可以实现JavaScript的模块化开发及加载机制。与jQuery等JavaScript框架不同,SeaJS不会扩展封装语言特性,而只是实现JavaScript的模块化及按模块加载。SeaJS的主要目的是令JavaScript开发模... 查看详情

nodejs的模块系统以及require的机制

一、简介  Nodejs有一个简单的模块加载系统。在Nodejs中,文件和模块是一一对应的(每个文件被视为一个独立的模块),这个文件可能是JavaScript代码,JSON或编译过的C/C++扩展,例如:/***foo.js*将这个js文件导出为模块*/exports.hel... 查看详情

深入了解nodejs模块机制(代码片段)

...的是CommonJS规范,当我们require('moduleA')时,模块是怎么通过名字或者路径获取到模块的呢?首先要聊一下模块引用、模块定义、模块标识三个概念。1CommonJS规范1.1模块引用模块上下文提供require()方法来引入外部... 查看详情

深入浅出nodejs模块加载机制

...。下面我们将详细说明require为我们所做的一切 nodejs模块加载原理node加载模块步骤:  1)路径分析(如判断是不是核心模块、是绝对路径还是相对路 查看详情

npm模块安装机制(代码片段)

  npm是Node的模块管理器,功能极其强大。它是Node获得成功的重要原因之一。正因为有了npm,我们只要一行命令:npminstall,就能安装别人写好的模块。一、从npminstall说起  npminstall命令用来安装模块到node_modules目录。$npminstal... 查看详情

es的zen发现机制

ES的Zen发现机制Zen发现机制是ElasticSearch默认的发现模块。它提供的是单播发现,但是可被拓展为支持云环境下或者其他形式的发现机制。zen发现模块集成了其他模块,如在发现期间,节点的通信就是通过transport模块实现。zen发现... 查看详情

Python 导入机制

...而且我对样式/约定也很感兴趣,所以我在这里问。1)如果模块A导入模块B,而模块B导入模块C,模块A中的代码可以在没有显式导入的情况下引用模块C吗?如果是这样,我认为这是不好的做法是否正确?2)如果 查看详情

协议(实现模块)层对缓存机制的支持。

@interfaceJWCacheURLProtocol:NSURLProtocol<NSURLSessionDataDelegate>-(void)startLoading{  NSCachedURLResponse*urlResponse=[[NSURLCachesharedURLCache]cachedResponseForRequest:[selfreque 查看详情

内存保护机制及绕过方案——利用未启用safeseh模块绕过safeseh

...(内存保护机制及绕过方案中查看)。利用未启用SafeSEH模块绕过SafeSEH⑴. 原理分析:一个不是仅包含中间语言(1L)且未启用SafeSEH的模块中的异常处理,如果异常处理链在栈上,异常处理函数指针不在栈上,那么这个异常处... 查看详情