sysfs是一个内存虚拟文件系统,提供了一个kobject层次结构的视图。sysfs根目录下包含至少10个目录:
l block:该目录包含了系统中注册的每个块设备对应的目录。这些目录中包含了块设备的任何分区。
l bus:该目录提供了系统总线的一个视图。
l class:该目录包含了按高级功能组织的系统中所有设备的一个视图。
l dev:该目录是已注册设备结点的一个视图。
l devices:该目录是系统设备的拓扑视图。它直接映射了内核中的设备层次结构。
l firmware:该目录包含了低层子系统如ACPI,EDD,EFI等等系统特定的树。
l fs:包含了已注册的文件系统的一个视图。
l kernel:该目录包含了内核配置选项和状态信息。
l modules:该目录包含了系统加载的模块的一个视图。
l power:该目录包含了系统范围内的电量管理数据。
从sysfs中添加和删除kobjects
初始化一个kobject,并将其导出到sysfs使用如下函数:
int kobject_add(struct kobject *kobj, struct kobject *parent, const char *fmt, ...);
一个kobject代表sysfs中的一个目录,如果父指针不为空,则它代表该父kobject对应目录下的一个子目录。struct kobject * kobject_create_and_add(const char *name, struct kobject *parent);该函数是一个辅助函数,它将kobject_create()和kobject_add()两个函数操作合为一个函数。
删除一个kobject对应的sysfs表示是通过函数void kobject_del(struct kobject *kobj);来进行的。
向sysfs中增加文件
kobject映射为目录,而它的属性则映射为文件。
默认属性
struct attribute {
const char *name; /* attribute’s name */
struct module *owner; /* owning module, if any */
mode_t mode; /* permissions */
};
sysfs_ops描述了怎样使用默认属性。
struct sysfs_ops {
/* method invoked on read of a sysfs file */
ssize_t (*show) (struct kobject *kobj,
struct attribute *attr,
char *buffer);
/* method invoked on write of a sysfs file */
ssize_t (*store) (struct kobject *kobj,
struct attribute *attr,
const char *buffer,
size_t size);
};
创建新属性
通常,默认属性已经足够了,然而,有时有些kobject比较特殊,需要提供一些特殊的
数据或功能。内核提供如下接口:
int sysfs_create_file(struct kobject *kobj, const struct attribute *attr);
当然,也可以创建文件链接,接口如下:
int sysfs_create_link(struct kobject *kobj, struct kobject *target, char *name);
销毁属性
对应于属性创建函数,有两个属性销毁接口:
void sysfs_remove_file(struct kobject *kobj, const struct attribute *attr);
void sysfs_remove_link(struct kobject *kobj, char *name);