linux设备模型中ktype的用法
[11-20 15:53:34] 来源:http://www.88dzw.com arm嵌入式 阅读:8153次
文章摘要:作者:刘洪涛,www.88dzw.com嵌入式培训中心高级讲师,ARM公司授权ATC讲师。在上篇《利用udev、sys动态创建设备结点》的记录中,设备驱动中主要依靠下面两个功能完成的:1、在/sys/class下创建farsight_class类my_class =class_create(THIS_module, "farsight_class");2、在farsight_class中创建新的class设备class_device_create(my_class,NULL, devno, NULL,"farsight_dev");然后会在/sys中出现
linux设备模型中ktype的用法,标签:arm嵌入式系统,arm系统,http://www.88dzw.com作者:刘洪涛,www.88dzw.com嵌入式培训中心高级讲师,ARM公司授权ATC讲师。
在上篇《利用udev、sys动态创建设备结点》的记录中,设备驱动中主要依靠下面两个功能完成的:
1、在/sys/class下创建farsight_class类
my_class =class_create(THIS_module, "farsight_class");
2、在farsight_class中创建新的class设备
class_device_create(my_class,NULL, devno, NULL,"farsight_dev");
然后会在/sys中出现如图的文件结构:
其中”dev”和uevent都是“属性”,可以读取dev获取设备的主次设备号;也可以对uevent操作;让内核发出“add”事件用于热插拔。如:
注:这里写入任何值都会导致“add”事件的产生,udevmonitor检测时现象如下:
UEVENT[1220019773.507374] add????? /class/farsight_class/farsight_dev (farsight_class)
那么上述功能实现的原理是什么呢?现在就要过度到本文的主题ktype的使用了。先认识下这个结构
kype的结构定义为:
struct kobj_type {
void (*release)(struct kobject *);
struct sysfs_ops *sysfs_ops;/*提供实现以下属性的方法*/
struct attribute **default_attrs; /*用于保存类型属性列表(指针的指针) */
};
其中 attribute定义为:
struct attribute {
char *name;/*属性的名字(在kobject的sysfs 目录中显示,如上文的dev、uvent)*/
struct module *owner;/*指向模块的指针(如果有), 此模块负责实现这个属性*/
mode_t mode; /*属性的保护位,modes 的宏定义在 <linux/stat.h>:例如S_IRUGO 为只读属性等等*/
}; /*default_attrs 列表中的最后一个元素必须用 0 填充*/
sysfs 系统中的属性读写是由 kobj_type->sysfs_ops 成员中的函数完成的:
struct sysfs_ops {
ssize_t (*show)(struct kobject *kobj, struct attribute *attr, char *buffer);
ssize_t (*store)(struct kobject *kobj, struct attribute *attr, const char *buffer, size_t size);
};
当用户空间读取一个属性时(如:#cat dev),内核会使用指向 kobject 的指针(kobj)和正确的属性结构(*attr)来调用show 方法,该方法将给定属性值编码进缓冲(buffer)(注意不要越界( PAGE_SIZE 字节)), 并返回实际数据长度。
也可对所有 kobject (通常指在一个kset关联的范围内)关联的属性使用同一个 show 方法,用传递到函数的 attr 指针来判断所请求的属性。有的 show 方法包含对属性名字的检查。有的show 方法会将属性结构嵌入另一个结构(本文举的例子就是用的这种方法), 这个结构包含需要返回属性值的信息,这时可用container_of 获得上层结构的指针以返回属性值的信息。
当用户空间写入一个属性时(如echo “hello” > event)内核会使用指向 kobject 的指针(kobj)和正确的属性结构(*attr)来调用store 方法。
store 方法将存在缓冲(buffer)的数据( size为数据的长度,不能超过 PAGE_SIZE )解码并保存新值到属性(*attr), 返回实际解码的字节数。store 方法只在拥有属性的写权限时才能被调用。此时注意:接收来自用户空间的数据一定要验证其合法性。如果到数据不匹配, 返回一个负的错误值。
每一个 kobject 需要有一个关联的 kobj_type 结构,指向这个结构的指针能在 2 个不同的地方找到:
(1)kobject 结构自身包含一个成员(ktype)指向kobj_type ;
struct kobject {
……
struct kobj_type * ktype;/*负责对该kobject类型进行跟踪的struct kobj_type的指针*/
……
}
(2)如果这个 kobject 是一个 kset 的成员, kset 会提供kobj_type 指针。
struct kset {
struct kobj_type * ktype; /*指向该kset对象类型的指针*/
《linux设备模型中ktype的用法》相关文章
- › 基于Linux下USB主机接口设计
- › 基于嵌入式Linux的TFT LCD IP及驱动的设计
- › 基于Linux平台的FPGA驱动开发
- › Linux PC和51系列单片机串行通信的设计
- › 利用MLD自动化操作系统移植降低 Linux 的成本
- › ColdFire单片机在 Clinux上的应用
- 在百度中搜索相关文章:linux设备模型中ktype的用法
- 在谷歌中搜索相关文章:linux设备模型中ktype的用法
- 在soso中搜索相关文章:linux设备模型中ktype的用法
- 在搜狗中搜索相关文章:linux设备模型中ktype的用法