Chinaunix首页 | 论坛 | 博客

分类: LINUX

2012-11-14 20:04:45

    Linux 2.6 内核引入了 sysfs 文件系统,把连接在系统上的设备和总线组织成分级的文件,使其从用户空间可以访问到。
    sysfs 被挂载到 /sys/ 目录下,它的子目录包括:
    block:在系统中发现的每个块设备在该目录下对应一个子目录。每个子目录中又包含一些属性文件,它们描述了这个块设备的各方面属性,如:设备大小。(loop块设备是使用文件来模拟的)
    bus:在内核中注册的每条总线在该目录下对应一个子目录,如:ide pci usb platform,其中每条总线目录又包含两个子目录:devices 和 drivers,devices 目录包含了在整个系统中发现的属于该总线类型的设备,drivers 目录包含了注册到该总线的所有驱动。
    class:将设备按照功能进行的分类,如 /sys/class/net 目录下包含了所有网络接口。
    devices:包含了系统所有的设备。
   
    kobject 实现了基本的面向对象管理机制,是构成 Linux 2.6 设备模型的核心结构。它与 sysfs 文件系统紧密相连,在内核中注册的每个 kobject 对象对应 sysfs 文件系统中的一个目录。kobject 常被嵌入于其它类型,如 bus device device_driver。
   
struct kobject {
    const char        *name;
    struct list_head    entry;
    struct kobject        *parent;
    struct kset        *kset;
    struct kobj_type    *ktype;
    struct sysfs_dirent    *sd;
    struct kref        kref;
    unsigned int state_initialized:1;
    unsigned int state_in_sysfs:1;
    unsigned int state_add_uevent_sent:1;
    unsigned int state_remove_uevent_sent:1;
    unsigned int uevent_suppress:1;
};

   
struct kobj_type 是为了描述一族 kobject 所具有的普遍特性,如此一来,不再需要为每个 kobject 分别定义自己的特性,而是将这些普遍的特性在 ktype 中一次定义,然后所有同类 kobject 都能共享一样的特性。   
struct kobj_type {
    void (*release)(struct kobject *kobj);
    const struct sysfs_ops *sysfs_ops;
    struct attribute **default_attrs;
    const struct kobj_ns_type_operations *(*child_ns_type)(struct kobject *kobj);
    const void *(*namespace)(struct kobject *kobj);
};

struct sysfs_ops {
    ssize_t    (*show)(struct kobject *, struct attribute *,char *);
    ssize_t    (*store)(struct kobject *,struct attribute *,const char *, size_t);
    const void *(*namespace)(struct kobject *, const struct attribute *);
};

struct attribute {
    const char        *name;
    umode_t            mode;
};

    包含在 kset 中的所有 kobject 被组织成一个双向循环链表(注意:“包含在”是指kobject结构体中的kset变量指向该kset),list 即是该链表的头。kset 结构体内嵌了一个 kobject 对象,所有属于这个 kset 的 kobject 对象的 parent 均指向这个内嵌的对象。    
struct kset {
    struct list_head list;
    spinlock_t list_lock;
    struct kobject kobj;
    const struct kset_uevent_ops *uevent_ops;
};

struct kset_uevent_ops {
    int (* const filter)(struct kset *kset, struct kobject *kobj);
    const char *(* const name)(struct kset *kset, struct kobject *kobj);
    int (* const uevent)(struct kset *kset, struct kobject *kobj,
              struct kobj_uevent_env *env);
};

    热插拔事件:在 Linux 系统中,当系统配置发送变化时,如:添加 kset 到系统,一个通知会从内核空间发送到用户空间,这就是热插拔事件。热插拔事件会导致用户空间中相应的处理程序(udev mdev)被调用,这些处理程序会通过加载驱动程序,创建设备节点等来响应热插拔事件。

                       ——忠于梦想 勇于实践    linux_xpj@opencores.org
阅读(1619) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~