Linux 核心--13.Linux动态模块( 三 )




12.2模块的卸载
模块可以通过使用rmmod命令来删除, 但是请求加载模块将被kerneld在其使用记数为0时自动从系统中删除 。kerneld在其每次idle定时器到期时都执行一个系统调用以将系统中所有不再使用的请求加载模块从系统中 删除 。这个定时器的值在启动kerneld时设置;我系统上的值为180秒 。这样如果你安装一个iso9660 CDROM并且你的iso9660文件系统是一个可加载模块, 则在卸载CD ROM后的很短时间内此iso9660模块将从核心中删除 。

如果核心中的其他部分还在使用某个模块, 则此模块不能被卸载 。例如如果你的系统中安装了多个VFAT文件系统则你将不能卸载VFAT模块 。执行lsmod我们将看到每个模块的引用记数 。如:

Module:#pages:Used by:
msdos51
vfat 41 (autoclean)
fat6[vfat msdos]2 (autoclean)

此记数表示依赖此模块的核心实体个数 。在上例中VFAT和msdos模块都依赖于fat模块, 所以fat模块的引用记数为2 。vfat和msdos模块的引用记数都为1 , 表示各有一个已安装文件系统 。如果我们安装另一个VFAT文件系统则vfat模块的引用记数将为2 。模块的引用记数被保存在其映象的第一个长字中 。这个字同时还包含AUTOCLEAN和VISITED标志 。请求加载模块使用这两个标志域 。如果模块被标记成AUTOCLEAN则核心知道此模 块可以自动卸载 。VISITED标志表示此模块正被一个或多个文件系统部分使用;只要有其他部分使用此模块则这个标志被置位 。每次系统被kerneld要求将没有谁使用的请求模块删除时 , 核心将在所有模块中扫描可能的候选者 。但是一般只查看那些被标志成AUTOCLEAN并处于RUNNING状态的模块 。如果某模块的VISITED 标记被清除则它将被删除出去 。如果某模块可以卸载 , 则可以调用其清除例程来释放掉分配给它的核心资源 。它所对应的module结构将被标记成DELETED并从核心模块链表中断开 。其他依赖于它的模块将修改它们各自的引用域来表示它们间的依赖关系不复存在 。此模块需要的核心内存都将被回收 。

推荐阅读