科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道Linux操作系统的内核模块全面解析 (1)

Linux操作系统的内核模块全面解析 (1)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

Windows NT是一种微内核的结构,其内核的功能块被划分成独立的模块,在这些功能块之间有严格的通信机制

作者:赛迪网技术社区 来源:赛迪网技术社区 2007年10月20日

关键字: 解析 模块 内核 Linux

  • 评论
  • 分享微博
  • 分享邮件
 

一、模块简介

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

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

3、模块的卸载

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

  
  rmmod modulename
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章