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在模块的源代码中定义。