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驱动:一、字符设备的介绍和demo
- 【Linux SPI】RFID RC522 设备驱动
- Linux 线程信号量,进程信号量和内核驱动程序信号量(线程同步信号量,进程同步信号量和设备驱动同步信号量)
- 如何编写一个简单的Linux驱动(二)——设备操作集file_operations
- linux设备驱动程序——将驱动程序编译进内核
- 驱动开发学习笔记. 0.04 linux 2.6 platform device register 平台设备注册 1/2 共2篇
- Linux字符设备驱动file_operations
- linux驱动程序之电源管理之标准linux休眠与唤醒机制分析(一)
- 《Linux4.0设备驱动开发详解》笔记--第五章:Linux文件系统与设备文件
- Linux设备驱动构建内核树