configfs文件系统是一种基于ram的文件系统,用于配置内核对象,configfs可以通过用户态目录文件访问接口配置复杂的对象,可以在用户态创建和删除内核对象。configfs 可以让用户通过shell 来配置内核对象
在samples下有个configfs_example的例程
分析如下:
这是一个模块,
static int __init configfs_example_init(void)
{
int ret;
int i;
struct configfs_subsystem *subsys;
#从这个for循环可以知道会建立三个configfs的子目录
for (i = 0; example_subsys[i]; i++) {
#得到要创建的configfs_subsystem
subsys = example_subsys[i];
#初始化configfs_subsystem
config_group_init(&subsys->su_group);
mutex_init(&subsys->su_mutex);
#创建configfs_subsystem
ret = configfs_register_subsystem(subsys);
if (ret) {
printk(KERN_ERR "Error %d while registering subsystem %s\n",
ret,
subsys->su_group.cg_item.ci_namebuf);
goto out_unregister;
}
}
return 0;
out_unregister:
for (i--; i >= 0; i--)
configfs_unregister_subsystem(example_subsys[i]);
return ret;
}
module_init(configfs_example_init);
*example_subsys的定义如下:可以看到会创建三个目录,我们以第一个childless为例
static struct configfs_subsystem *example_subsys[] = {
&childless_subsys.subsys,
&simple_children_subsys,
&group_children_subsys,
NULL,
};
可以看到这里通过configfs的cg_item中的.ci_namebuf 来指定目录的名字为01-childless
static struct childless childless_subsys = {
.subsys = {
.su_group = {
.cg_item = {
.ci_namebuf = "01-childless",
.ci_type = &childless_type,
},
},
},
};
从childless_type 可以知道,在01-childless 这个目录下定义了两个ro的对象showme和description,一个rw的对象storeme
CONFIGFS_ATTR_RO(childless_, showme);
CONFIGFS_ATTR(childless_, storeme);
CONFIGFS_ATTR_RO(childless_, description);
static struct configfs_attribute *childless_attrs[] = {
&childless_attr_showme,
&childless_attr_storeme,
&childless_attr_description,
NULL,
};
static const struct config_item_type childless_type = {
.ct_attrs = childless_attrs,
.ct_owner = THIS_MODULE,
};
这里以storeme为例,可以看到就是讲字符串保存到childless->storeme
static ssize_t childless_storeme_store(struct config_item *item,
const char *page, size_t count)
{
struct childless *childless = to_childless(item);
unsigned long tmp;
char *p = (char *) page;
tmp = simple_strtoul(p, &p, 10);
if (!p || (*p && (*p != '\n')))
return -EINVAL;
if (tmp > INT_MAX)
return -ERANGE;
childless->storeme = tmp;
return count;
}