本文共 2105 字,大约阅读时间需要 7 分钟。
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-childlessstatic 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的对象storemeCONFIGFS_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->storemestatic 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;}
转载地址:http://linmi.baihongyu.com/