configfs例程

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;
}

猜你喜欢

转载自blog.csdn.net/tiantao2012/article/details/81356136