Linux设备驱动模型之Kobject

Sysfs文件系统(Linux2.6)
    基于RAM的文件系统,与proc系统类似(不存在本地磁盘,掉电易失),对应Linux系统下的/sys目录。该文件系统的说明可参考Linux内核源码Documentation/filesystems/sysfs.txt文档。该文档中对其功能叙述为:sysfs is a ram-based filesystem initially based on ramfs. Itprovides a means to export kernel data structures, their attributes, and the linkages between them to userspace.
以下为Ubuntu下该目录的内容。


重要子目录说明:
block:系统中每个块设备对应block目录下的一个子目录,典型的有sda磁盘子目录,而每个子目录下又包含一些对该设备各方面(如块设备大小、状态等等)描述的文件或目录。  
bus:系统中每条总线对应该目录下的一个子目录,典型的有i2c、pci、usb、scsi、pcmcia等,而每个总线子目录下又会包含devices和drivers子目录。devices子目录包含所有挂载在该总线上的所有设备。drivers子目录包含注册到该总线上的所有驱动。
class:将设备按功能进行分类,每个子目录包含一类设备。
devices:包含系统的所有设备。
kernel:内核配置参数。
module:系统中所有模块的信息。
firmware:系统中的固件。
fs:文件系统的描述。
power:系统中电源选项。
注意:bus/devices目录下和class目录下的设备都是/sys/devices目录下的软链接。
kobject
  kobject采用面向对象的机制来管理Linux中的设备,内核中注册的每个kobject对象对应sysfs文件系统中的每一个目录。
kobject结构:
#include<linux/kobject.h>
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;
};
ktype成员是一个指向kobj_type结构的指针,该结构中记录了 kobject对象的一些操作函数和属性
struct kobj_type{
    void (*release)(struct kobject *kobj);
    struct sysfs_ops *sysfs_ops;
    struct attribute **default_attrs;
}
release成员:用于释放kobject占用的资源时,所调用的函数,当kobject引用计数为0时,被调用。
struct attribute {
    char *name;  //文件名
    struct module * owner;
    mode_t mode; //属性保护位
}
struct attribute:对应于kobject目录下的一个文件,name成员即为文件名。
default_attrs成员:即为一个kobject目录下的 所有文件
struct sysfs_ops{
    ssize_t (*show)(struct kobject *kobject, struct attribute *attr,char *buf);
    ssize_t (*store)(struct kobject *kobject,struct attribute *attr,const char *buf, size_t count);
}
show函数:当用户读该kobject对应的目录中的文件时,该函数被调用。
store函数:当用户写该kobject对应的目录中的文件时,该函数被调用。
kobject操作:
void kobject_init(struct kobject *kobj, struct kobj_type *ktype);
初始化kobject结构
 
int kobject_add(struct kobject *kobj);
将kobject对象添加到Linux系统中。
 
int kobject_init_and_add(struct kobject *kobj,
struct kobj_type *ktype,struct kobject *parent,const char *fmt,...);
初始化kobject,并将其添加到Linux系统。
 
void kobject_del(struct kobject *kobj);
从Linux系统中删除kobject对象。
 
struct kobject * kobject_get(struct kobject *kobj);
将kobject对象的引用计数加1,同时返回该对象指针。
 
void kobject_put(struct kobject *kobj);
将kobject对象的引用计数减1,如果引用计数降为0,则调用release方法释放该kobject对象。
 
 
 
 
 
 
 
 

你可能感兴趣的:(Linux设备驱动模型之Kobject)