一、模块简介

Windows NT是一种微内核的结构,其内核的功能块被划分成单独的模块,在这些功能块之间有严格的通信机制;而Linux则不同,他是一种monolithic(单一大块)结构,也就是说,整个内核是个单独的、很大的程式。在这种结构中,部件的添加和删除都相当麻烦,需要重新编译内核。为了解决这个问题,不知道从哪个版本的内核开始,Linux引入了一种称为module(模块)的技术,能够把某些功能代码作为模块动态装载到内核中使用。

模块是一种目标对象文档,需要在内核空间执行,能够把他看作是一组已编译好而且已链接成可执行文档的程式。在需要的时候,内核就会实用某种方法调用这些程式来执行特定的操作,实现特定的功能。内核在内核符号表中维护了一个模块的链表,每个符号表对应一个模块,在把模块加载进内核时正确地对其进行解释,并将模块作为内核的一部分来执行;加载进内核中的模块具备任何的内核权限。模块能够在系统启动时加载到系统中,也能够在系统运行的任何时刻加载;在无需时,能够将模块动态卸载。这样就不用每次修改系统的配置时都要重新编译内核了。

二、模块的优缺点

内核模块的这种动态装载特性具备以下的长处:

1、能够把内核映像文档保持在最小。在编译内核时能够选择把一部分内容当成模块进行编译,这样在最终生成的内核映像文档中就能够不包含这部分内容,从而生成最小的内核映像文档。

2、灵活性好。假如需要实用新的模块,不必重新编译内核,只要把新的模块编译后装载进系统中就能够了。假如对内核源程式进行了修改,也无需重新编译整个内核,只需要修改对应的部分就能够了。

但是,内核模块的引入也带来了一些问题:

1、这种动态加载的特性不利于系统的性能和内存的利用,会带来负面的影响。

2、装入内核的模块和其他内核部分相同具备最高的权限,使用不当就可能引起系统的崩溃。

3、内核版本和模块版本的不兼容也会导致系统的崩溃,因此必须进行严格的版本检查,这样就使模块的编写变得更加复杂了。

4、有些模块要使用其他模块(例如VFAT就要使用FAT)的内容,模块之间存在一定的依赖关系,这样模块的实用就复杂化了。

由于模块的这种动态装载/卸载的特性,在Linux中大部分设备驱动程式都是使用模块来编写的,例如文档系统(minix、msdos、isofs、smbms、nfs、proc等等)、SCSI设备驱动程式、以太网驱动程式、CD-ROM驱动程式等等。下面让我们介绍一下模块的使用方法。

三、模块的使用

1、模块的查询

我们能够使用lsmod命令来了解系统中现在装载进来了哪些模块。例如,在笔者机器上执行的结果为(注意,以下介绍的这些命令(包括lsmod)只有终极用户才能够执行):

 

 

              Module Size Used by

              lockd 30344 1 (autoclean)

              sunrpc 52132 1 (autoclean) [lockd]

              rtl8139 11748 1 (autoclean)
  

其中Module列是模块的名字,Size是显示的模块的大小,Used by列表示引用次数,圆括号中的autoclean表示该模块能够在空闲时自动卸载,中括号中的[lockd]表示模块lockd会引用sunrpc模块的内容。

2、模块的装载

模块的装载有两种方法:一种是实用insmod命令手工加载模块,第二种方法是使用内核守护进程kerneld在需要的时候动态装载。insmod命令的格式为:

  

              insmod //modulename.o
  

值得注意的是,insmod命令需要知道模块存放的位置,这样才能在内核符号表中进行解析。模块能够位于当前路径中,也能够在insmod命令中指明绝对路径,另外更有几个相关的配置文档能够说明模块的位置(见后文中的介绍)。

kerneld是个标准的守护进程,具备终极用户的权限,其主要功能是加载和卸载核心模块, 但是他还能够执行其他任务, 如通过串行线路建立PPP连接并在适当时候关闭他。kerneld自身并不执行这些任务,他通过某些程式如insmod来做此工作。他只是内核的代理,为内核进行调度。这个守护进程仅仅是个带有终极用户权限的普通用户进程。当系统启动时他也被启动并为内核打开了一个进程间通讯(IPC)通道,内核需要执行各种任务时就实用这个IPC来向kerneld发送消息。例如,假如内核请求现在还没有装载到系统中的文档系统,那么就通知kerneld装载这个文档系统,然后内核就能够使用这个文档系统了。在模块空闲时(即没有其他进程使用这个模块时),kerneld还能够动态卸载这个模块。

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!