正在加载
请稍等

菜单

红楼飞雪 梦

15526773247

文章

Home android 嵌入式开发 如何插入和卸载模块
Home android 嵌入式开发 如何插入和卸载模块

如何插入和卸载模块

android 嵌入式开发, linux开发学习 by

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

 

 

28 2015-11

 

我要 分享

 

 

本文 作者

 

相关 文章