10.3.2 如何插入和卸载模块

   如前所述,插入和卸载模块的实用程序为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

这条消息告诉你,insmodusbcore.o当作一个合法的可装入模块来看待,并查找这个模块曾经被编译的内核版本,但没有找到。但我们知道,真正的原因是这个文件根本就不是一个可安装模块。

  从内核卸载一个模块的命令为rmmod,例如卸载ne模块的命令为:

   rmmod  ne