科技行者

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

知识库

知识库 安全导航

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

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

  • 扫一扫
    分享文章到微信

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

需要注意的是,模块只有在空闲时才能够从系统中卸载出去。lsmod输出结果中的Used by一列就说明了模块当前的状态。

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

关键字: 内核 Linux 模块 解析

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

需要注意的是,模块只有在空闲时才能够从系统中卸载出去。lsmod输出结果中的Used by一列就说明了模块当前的状态。如果该值不为0,说明模块正忙,不能卸载;否则该值为0,说明模块空闲,可以从系统中卸载出去。对于繁忙的设备,我们首先得断开对应设备的连接,然后才能删除对应的模块。例如,我们要卸载模块rtl8139(这个模块是笔者机器中rtl8139的以太网卡对应的模块),我们首先要断开网络连接:

  
  ifdown eth0 /* eth0是笔者机器中的第一块网卡*/ 
 
 

现在再执行lsmod命令的输出结果为:

  
  Module Size Used by 
  lockd 30344 1 (autoclean) 
  sunrpc 52132 1 (autoclean) [lockd] 
  rtl8139 11748 0 (autoclean) 
 
 

说明已经没有设备再使用rtl8139了,我们可以使用

  
  rmmod rtl8139
  

命令将其从系统中卸载出去。

标志为autoclean(见有关lsmod的介绍)的模块可以自动卸载。前面我们已经提到,模块之间可能会有引用关系。如果A模块引用了B模块的内容,那么必须先装载B模块之后才能成功装载A模块;在卸载B模块之前也要首先卸载A模块,否则就会导致系统的崩溃(当然,如果模块源程序编写的正确,在卸载A模块之前,B模块是无法卸载的)。

4、模块实用工具

以上我们介绍的lsmod、insmod、rmmod是一组实用工具所提供的三个命令,这组实用工具一般是和内核版本对应的,其1.3.57版本名为modules(modules-1.3.57.tar.gz),高一点的版本名为modutils(例如modutils-2.4.2.tar.gz)。最好保证你的系统中的模块实用工具的版本号(可以使用modinfo -V命令来查看)不低于内核版本号(可以使用uname -r来查看)。1.3.57版本的modules内容包括modprobe、depmod、genksyms、makecrc32、insmod、rmmod、lsmod、ksyms、kerneld等命令。其中modprobe和insmod命令类似,不过它要依赖于相关的配置文件;depmod用于生成模块依赖文件/lib/modules/kernel-version/modules.dep;genksyms和ksyms与内核函数的版本号有关(由于内核的不断更新,各个版本的内核函数各有不同,为了不会引起系统的崩溃,内核源程序中要对内核函数的版本号进行严格地控制)。在以后版本的实用工具中,使用kmod来取代了kerneld。kmod的功能和kerneld类似,但是它不能自动卸载模块。之所以采用kmod的原因在于kerneld是使用IPC通道实现的,相当于多经过了一层处理,另外kerneld的代码也比较复杂,kmod的代码数量也比kerneld少得多。

5、与模块有关的内核编译选项和过程

在使用make confing / make menuconfig / make xconfig对内核进行配置时,和模块有关的选项有:

  Code maturity level options --> 
  Prompt for development and/or incomplete code/drivers

此选项为代码的成熟程度。所有新的设计与改进都首先在开发版(版本号为x.y.z,其中y是奇数)中试用,经过验证技术可行之后再在稳定版(版本号为x.y.z,其中y是偶数)中正式引入。尚不成熟或不完善的技术在默认的情况中是不会编译到内核中的,如果你希望试验这些内容(例如2.4.*版本中的khttpd、IPV6等),就要选中这个选项。

  > 
  Loadable module support --> 
  Enable module support 
  Set version information on all module symbols 
  Kernel module loader

此选项是对可装载内核的支持以及对模块符号的版本号、内核模块装载程序支持的选项。对于其他大部分选项来说,你可以将相应的代码编译到内核中(使用build-in方式),也可以将他们编译成模块(使用module)方式。

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

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

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