学习啦 > 学习电脑 > 操作系统 > 操作系统基础知识 > Linux操作系统的模块全面详解

Linux操作系统的模块全面详解

时间: 佳洲1085 分享

Linux操作系统的模块全面详解

  Linux操作系统中模块的概念想必很多人都不太了解。下面由学习啦小编为大家整理了Linux操作系统的模块全面详解,希望对大家有帮助!

  Linux操作系统的模块全面详解一、模块简介

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

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

  Linux操作系统的模块全面详解二、模块的优缺点

  内核模块的这种动态装载特性具有以下的优点:

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

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

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

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

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

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

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

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

  Linux操作系统的模块全面详解三、模块的使用

  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还可以动态卸载这个模块。

  需要注意的是,如果模块之间有某种引用关系,那么装载模块时必须遵循一定的次序。例如,上面lsmod显示的结果中lockd模块要引用sunrpc的内容,那么必须首先装载sunrpc之后才能装载lockd,否则就会出错。

  3、模块的卸载

  我们可以使用rmmod命令把模块从系统中卸载出去,该命令的格式为:

  rmmod modulename

3637332