Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1416806
  • 博文数量: 1334
  • 博客积分: 645
  • 博客等级: 上士
  • 技术积分: 5762
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-25 16:56
文章分类

全部博文(1334)

文章存档

2014年(108)

2013年(1059)

2012年(169)

分类: LINUX

2013-01-18 19:31:56

原文地址:linux内核:sysfs初步 作者:zengxg14


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文本文件,且每个文件有一个值,也可以每个文件含一组同类型的值(即是数组也)

属性的结构体如下:
  1. struct attribute {
  2.     char *name;
  3.     struct module *owner;
  4.     mode_t mode;
  5. };

  6. /* 为属性创建文件 */ 
  7. int sysfs_create_file(struct kobject *kobj, const struct attribute *attr);
  8. /* 删除指定属性的文件 */
  9. int sysfs remove_file(struct kobject *kobj, const struct attribute *attr);

当子系统定义了一个新的属性类型时,它必须实现一组sysfs操作来将read和write操作转换为
对属性的show和store操作。

  1. struct sysfs_ops {
  2.     ssize_t (*show)(struct kobject *, struct attribute *, char *);
  3.     ssize_t (*store)(struct kobject *, struct attribute *, const char *);
  4. };
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函数。



阅读(159) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~