首页 | Linux 基础 | 资讯动态 | Linux 应用 | Linux 服务器 | Linux 开发 | Linux 安全 | 专题 | 联盟论坛
  当前位置:主页>Linux 开发>linux 内核>文章内容
Linux内核可装载模块对设备驱动的影响
来源:www.unix5.com 作者:riechelr_hl 发布时间:2007-05-26  

 

try_module_get 与module_put的引入与使用与2.6内核下的设备模型密切相关。模块是用来管理硬件设备的,2.6 内核为不同类型的设备定义了struct module *owner 域,用来指向管理此设备的模块。如字符设备的定义:

 

struct cdev { struct kobject kobj; struct module *owner; struct file_operations *ops; struct list_head list; dev_t dev; unsigned int count; };

 

从设备使用的角度出发,当需要打开、开始使用某个设备时,使用try_module_get(dev→owner)去增加管理此设备的 owner模块的使用计数;当关闭、不再使用此设备时,使用module_put(dev→owner)减少对管理此设备的owner模块的使用计数。这样,当设备在使用时,管理此设备的模块就不能被卸载;只有设备不再使用时模块才能被卸载。

 

2.6内核下,对于为具体设备写驱动的开发人员而言,基本无需使用try_module_get与module_put,因为此时开发人员所写的驱动通常为支持某具体设备的owner模块,对此设备owner模块的计数管理由内核里更底层的代码如总线驱动或是此类设备共用的核心模块来实现,从而简化了设备驱动开发。

2.5 模块输出的内核符号

 

2.4 内核下,缺省情况时模块中的非静态全局变量及函数在模块加载后会输出到内核空间。

 

2.6 内核下,缺省情况时模块中的非静态全局变量及函数在模块加载后不会输出到内核空间,需要显式调用宏EXPORT_SYMBOL才能输出。所以在2.6 内核的模块下,EXPORT_NO_SYMBOLS宏的调用没有意义,是空操作。在同时支持2.4与2.6内核的设备驱动中,可以通过以下代码段来输出模块的内核符号

 

清单6: 同时支持2.4与2.6的输出内核符号代码段

 

EXPORT_NO_SYMBOLS; EXPORT_SYMBOL(var); EXPORT_SYMBOL(func);

 

需要注意的是如需在2.4内核下使用 EXPORT_SYMBOL,必须在 CFLAGS中定义 EXPORT_SYMTAB,否则编译把会失败。

 

从良好的代码风格角度出发,模块中不需要输出到内核空间且不需为模块中其它文件所用的全局变量及函数最好显式申明为static类型,需要输出的内核符号以模块名为前缀。

 

模块加载后,2.4内核下可通过 /proc/ksyms、 2.6 内核下可通过/proc/kallsyms查看模块输出的内核符号

 

2.6 模块的命令行输入参数

 

在装载内核模块时,用户可以向模块传递一些参数,如`modprobe modname var=`,否则,var把使用模块内定义的缺省值。

 

2.4内核下,linux/module.h中定义有宏MODULE_PARM(var,type) 用于向模块传递命令行参数。var为接受参数值的变量名,type为采取如下格式的字符串[min[-max]]{b,h,i,l,s}。min及max 用于表示当参数为数组类型时,允许输入的数组元素的个数范围;b:byte;h:short;i:int;l:long;s:string。

 

2.6内核下,宏MODULE_PARM(var,type)不再被支持。在头文件linux/moduleparam.h里定义了如下宏:

 

module_param(name, type, perm) module_param_array(name, type, nump, perm)

 

type 类型可以是byte、short,、ushort、 int、 uint、long、ulong、charp, bool or invbool, 不再采用2.4内核中的字符串形式,而且在模块编译时会把此处申明的type与变量定义的类型进行比较,判断是否一致。

 

perm表示此参数在sysfs文件系统中所对应的文件节点的属性。2.6内核使用sysfs文件系统,这是一个建立在内存中比proc更强大的文件系统。sysfs文件系统可以动态、实时,有组织层次地反应当前系统中的硬件、驱动等状态。当perm为0时,表示此参数不存在sysfs文件系统下对应的文件节点。模块被加载后,在/sys/module/ 目录下把出现以此模块名命名的目录。如果此模块存在perm不为0的命令行参数,在此模块的目录下把出现parameters目录,包含一系列以参数名命名的文件节点,这些文件的权限值等于perm,文件的内容为参数的值。

 

nump 为保存输入的数组元素个数的变量的指针。当不需保存实际输入的数组元素个数时,可以设为NULL。从2.6.0至2.6.10 版本,须把变量名赋给nump;从2.6.10 版本开始,须把变量的引用赋给nump,这更易为开发人员理解。加载模块时,使用逗号分隔输入的数组元素。

 

清单7: 适用于2.4与2.6内核的模块输入参数模板

 

int debug = 0; char *mode = “800x600”; int tuner[4] = {1, 1, 1, 1};

 

int tuner_c = 1;

 

MODULE_PARM(debug, “i”); MODULE_PARM(mode, “s”); MODULE_PARM(tuner,“1-4i”); module_param(debug, int, 0644); module_param(mode, charp, 0644); module_param_array(tuner, int, &tuner_c, 0644); module_param_array(tuner, int, tuner_c, 0644);

共4页: 上一页 [1] [2] 3 [4] 下一页
 
如果您对本文有任何疑问或者建议,请到论坛讨论区发表您的意见: >> 论坛入口
[收藏] [推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
  热点文章
·使用 Linux 系统调用的内核命令
·Linux 2.6.11内核文件IO系统调用
·Linux操作系统的源代码目录树结
·Linux用户态与内核态的交互讲解
·Linux内核对I/O端口的管理实现(
·深入分析 Linux操作系统的内核链
·概述Linux系统的驱动框架及驱动
·详解Linux 2.6内核新文件系统变
·Linux系统可卸载内核模块完全指
·FreeBSD手册讲解(一)--配置FreeB
·编译Linux操作系统的内核讲解
·Linux系统可卸载内核模块完全指
  相关文章
·详细解析Linux操作系统的内核空
·走向Linux系统高手之路 编译内核
·Linux操作系统内核启动参数详细
·深入分析 Linux操作系统的内核链
·Linux内核入侵检测安全增强实现
·Linux内核入侵检测安全增强实现
·剖析Linux 2.6内核在嵌入式上的
·Linux操作系统的源代码目录树结
·使用 Linux 系统调用的内核命令
·Linux内核对I/O端口的管理实现(
·Linux内核对I/O端口的管理实现(
·内核设计篇

本站信息源至:互联网络,均为学习,交流所用,如有版权问题,请联系我们.
站长QQ:397422079 E_mail:riechelr_hl@unix5.com
转载本站内容请注明原作者名.谢谢!