Documentation中的"filesystems/sysfs.txt"有对sysfs的一个介绍。
“对于每个在系统中register的kobject,在sysfs中都有一个目录,该目录是kobject->parent的子目录”
1:只有register后的kobject才有目录
2:是目录不是普通文件。
3:最顶层的目录为kobject所属的子系统
Attributes
在sysfs文件系统中,kobject的Attributes表现为一个常规文件。
针对该文件的I/O操作,调用预定义的method(方法或函数)。
Attributes应该为ASCII文本文件,且每个文件有一个值,也可以每个文件含一组同类型的值(即是数组也)
属性的结构体如下:
- struct attribute {
- char *name;
- struct module *owner;
- mode_t mode;
- };
- /* 为属性创建文件 */
- int sysfs_create_file(struct kobject *kobj, const struct attribute *attr);
- /* 删除指定属性的文件 */
- int sysfs remove_file(struct kobject *kobj, const struct attribute *attr);
当子系统定义了一个新的属性类型时,它必须实现一组sysfs操作来将read和write操作转换为
对属性的show和store操作。
- struct sysfs_ops {
- ssize_t (*show)(struct kobject *, struct attribute *, char *);
- ssize_t (*store)(struct kobject *, struct attribute *, const char *);
- };
sysfs分配一个PAGE_SIZE大小的缓冲区,并传递给show和store函数。
(1)read时:show方法应该填充整个buffer。
(2)write时:用户空间先读,然后将buffer中的内容修改,然后写回去
读和写的时候,使用同一个buffer。
以设备属性为例,讲述对属性文件进行I/O操作时会发生的事情。
struct device_attribute {
struct attribute attr;
ssize_t (*show)(struct device *dev, struct device_attribute *attr, char *buf);
ssize_t (*store)(struct device *dev, struct device_attribute *attr, const char *buf, size_t count);
};
当你read/write该属性对应的文件时,对调用该结构体中指定的show/store函数
static ssize_t dev_attr_show(struct kobject *kobj, struct attribute *attr, char *buf)
{
struct device_attribute *dev_attr = to_dev_attr(attr);
struct device *dev = to_dev(kobj);
ssize_t ret = 0;
if (dev_attr->show)
ret = dev_attr->show(dev, buf);
return ret;
}
当你read该属性的文件时,
(1)找到该属性文件上层目录所对应的kobject,
(2)由kobject取得ktype,
(3)调用ktype中的sysfs_ops中指定的show函数,这个需要实现指定,在这个例子里就是dev_attr_show函数。
(4)dev_attr_show函数会调用dev_attr->show(dev,buf)来调用device_attribute中的show函数。即你创建一个device_attribute变量时指定的show函数。
阅读(1274) | 评论(0) | 转发(2) |