如前所述,插入和卸载模块的实用程序为insmod 和 rmmod,在此,我们将介绍在使用这些命令的过程中会遇到的问题,而并不详细介绍其用法,其更详细的使用请用man命令进行查看。
只有超级用户才能插入一个模块,其简单的命令如下:
insmod serial.o
其中,serial.o为串口的驱动程序。
但是,这条命令执行以后可能会出现错误信息,诸如模块与内核版本不匹配、不认识的符号等。
例如,如果你想插入msdos.o,就可能出现如下信息:
msdos.o: unresolved symbol fat_date_unix2dos
msdos.o: unresolved symbol fat_add_cluster1
msdos.o: unresolved symbol fat_put_super
...
这是因为msdos.o引用的这些符号不是由内核“移出”的。为了证实这点,你可以查看/proc/ksyms,从中就可以发现内核移出的所有符号,但找不到“fat_date_unix2dos
”符号。那么,怎样才能让这个符号出现在符号列表中呢?从这个符号可以看出,msdos.o所依赖的模块为fat.o,于是重新使用insmod命令把fat.o插入到内核,然后再查看/proc/modules,就会发现有两个模块被装入,并且一个模块依赖于另一个模块:
msdos 5632 0 (unused)
fat 30400 0 [msdos]
也许你要问,怎么才能知道所依赖的模块呢?除了从符号名判断外,更有效的方法是使用depmod 和 modprobe命令来代替insmod命令。
当错误信息为“kernel/module version mismatch”时,说明内核和模块的版本不匹配,这部分内容我们将在后面给予讨论。
通常情况下,当你插入模块时,还需要把参数传递给模块。例如,一个设备驱动程序想知道它所驱动的设备的I/O地址和IRQ,或者一个网络驱动程序想知道你要它进行多少次的诊断跟踪。这里给出一个例子:
insmod ne.o io=0x400 irq=10
这里装入的是NE2000类的以太网适配器驱动程序,并告诉它以太网适配器的I/O地址为0x400,其所产生的中断为IRQ 10。
对于可装入模块,并没有标准的参数形式,也几乎没有什么约定。每个模块的编写者可以决定insmod可以用什么样的参数。对于Linux内核现已支持的模块,Linux HOWTO文档给出了每种驱动程序的参数信息。
另外,一个常见的错误是试图插入一个不是可装入模块的目标文件。例如,在内核配置阶段,你把USB核心模块静态地连接进基本内核中,因此,USB核心模块就不是可装入模块。该模块的文件名是usbcore.o,这看起来与可装入模块的文件名usbcore.o完全一样,但是你不能用insmod命令插入那个文件,否则,出现以下错误信息:
usbcore.o: couldn't find the kernel version this module was compiled for
这条消息告诉你,insmod把usbcore.o当作一个合法的可装入模块来看待,并查找这个模块曾经被编译的内核版本,但没有找到。但我们知道,真正的原因是这个文件根本就不是一个可安装模块。
从内核卸载一个模块的命令为rmmod,例如卸载ne模块的命令为:
rmmod ne