Linux设备驱动模型之Kobject

时间:2022-01-22 11:16:53
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下该目录的内容。
Linux设备驱动模型之Kobject
Linux设备驱动模型之Kobject
Linux设备驱动模型之Kobject重要子目录说明: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对象。