嵌入式Linux网络体系结构设计与TCP/IP协议栈
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.4.1 管理内核模块

内核模块由目标代码组成,它在运行时装载到内核地址空间并运行。在系统启动时,内核事先并不知道会有什么功能的模块会装载到系统中,所以模块必须自己通知内核,让相应的组件知道模块加载与否。当模块移走时,它也需要移走所有在内核地址空间对它的引用,释放占用的系统资源。这里有两个方法是用来完成以上任务的。

● init_模块:向内核注册由模块提供的所有功能。

● cleanup_模块:撤销任何由init_模块所做的功能。

这两个方法每个模块都需要实现。在进一步深入理解模块的工作原理之前,我们首先给出一些常规的命令,以便了解如何从内核外来管理模块,用户可以用以下工具来手动插入和卸载模块。

1.插入模块

insmod模块name.o [arguments]:该命令用于装载一个内核模块到内核地址空间。如果成功,模块的目标代码就被链接到内核中了,这样模块就可以访问内核的符号(函数和数据结构)。发送命令insmod后会引起以下的系统调用执行。

● sys_create_模块:给模块在内核地址空间分配其驻留所需的内存。

● sys_get_kernel_syms:返回内核的符号表,解决模块中尚未连接的对内核符号的引用。

● sys_init_模块:复制模块的目标代码到内核地址空间,并调用模块的初始化函数(init_模块)执行模块的初始化功能。

2.给模块传参数

当我们装载模块时,也可以给模块传参数(例如设备的名称name,设备的中断信号irq和I/O端口地址io_addr)。在实现模块时,这些参数需要在模块中用宏MODULE_PARM(arg,type,default)来说明装载模块时可以给模块传哪些参数。当用insmod命令装载模块时,这些参数可以直接传给要调度的模块:

    [root@localhost]# insmod mylan_cs.o eth=1 network_name="myWavlan"

在上例中,我们插入了一个名为mylan_cs.o的模块,并给它传送了两个参数,一个是设备ID,一个是设备名。

3.移走模块

rmmod模块name:从内核地址空间卸载指定的模块。为此该命令会引起系统调用函数sys_delete_模块的执行,而sys_delete_模块系统会调用模块的清除函数cleanup_模块。这样模块就从内核地址空间卸载了。

4.其他用户空间命令

● lsmod:列表当前所有装载了的模块以及它们相互的依赖关系和引用计数。

● modinfo:给出关于模块的信息(它的功能、参数和所有者等)。这些信息并不是自动产生的,它需要使用宏MODULE_DESCRIPTION,MODULE_AUTHOR在模块的源代码中定义。