目录
1 概述
本文介绍了configfs和sys的区别与使用流程,以实例来分析使用过程。
2 configfs与sys
configfs是基于ram的文件系统,这一点与sysfs很像,但是与sysfs不同之处在于,configfs可以通过在用户态的操作创建和删除内核对象,而我们一般使用sysfs是已经有内核对象之后,再去创建sysfs文件节点。从使用上看都可以通过read write读取/修改文件属性,重点在于sysfs的内核对象是在内核创建、销毁的,sysfs是访问这些内核对象的窗口。但是configfs的内核对象的创建/销毁是由用户态的mkdir等操作完成,用户执行mkdir会在内核创建一个config_item对象,用户执行rmdir会销毁这个对象。
注:来自https://www.kernel.org/doc/Documentation/filesystems/configfs/configfs.txt
3 configfs
3.1 configfs介绍
是一种基于ram的文件系统,在用户空间配置内核对象,可直接察看,通过用户态目录文件访问接口,适用于内核对象有众多复杂的配置。一般当内核需要很多参数需要配置时或者当需要动态创建内核对象并且内核对象需要修改配置时,会考虑用configfs实现。
3.2 基本使用结构原理
顶层结构是struct configfs_subsystem,为configfs子系统结构:
struct configfs_subsystem {
struct config_group su_group;
struct mutex su_mutex;
};
接着是struct config_group,是configfs目录和属性的容器,即group下不仅可以有item,也可以链接下一级group,后面章节示例。
struct config_group {
struct config_item cg_item;
struct list_head cg_children;
struct configfs_subsystem *cg_subsys;
struct list_head default_groups;
struct list_head group_entry;
};
struct config_item是configfs目录,代表可配置的内核对象
struct config_item {
char *ci_name;
char ci_namebuf[CONFIGFS_ITEM_NAME_LEN];
struct kref ci_kref;
struct list_head ci_entry;
struct config_item *ci_parent;
struct config_group *ci_group;
const struct config_item_type *ci_type;
struct dentry *ci_dentry;
};
struct configfs_attribute是目录下面的属性:
struct configfs_attribute {
const char *ca_name;
struct module *ca_owner;
umode_t ca_mode;
ssize_t (*show)(struct config_item *, char *);
ssize_t (*store)(struct config_item *, const char *, size_t);
};
3.3 使用与示例
使用configfs功能需要打开内核配置支持CONFIG_CONFIGFS_FS=y
一般情况下需要先注册系统 configfs_register_subsystem
static int __init testfs_init(void)
{
config_group_init(&testfs_subsys.su_group);
return configfs_register_subsystem(&testfs_subsys);
}
testfs_subsys是
static struct configfs_group_operations testfs_ops = {
.make_group = &testfs_make,
.