configfs: configfs是一个基于内存的虚拟文件系统,与sysfs相反,sysfs是为了导出内核对象给用户空间查看。configfs是为了从用户空间配置内核对象,而不用重编内核与修改内核代码。
其内核对象结构如图:
目录: 数据结构
struct config_item { //通常作为一个成员嵌入到子系统的结构体中
char *ci_name;
char ci_namebuf[UOBJ_NAME_LEN];
struct kref ci_kref;
struct list_head ci_entry;
struct config_item *ci_parent;
struct config_group *ci_group;
struct config_item_type *ci_type;
struct dentry *ci_dentry;
};
初始化config_item:
void config_item_init(struct config_item *);
初始化config_item以及item_type:
void config_item_init_type_name(struct config_item *,const char *name,struct config_item_type *type);
获取item:
struct config_item *config_item_get(struct config_item *);
释放item:
void config_item_put(struct config_item *);
目录类型:
struct config_item_type {
struct module *ct_owner;模块名
struct configfs_item_operations *ct_item_ops; 目录中属性操作表
struct configfs_group_operations *ct_group_ops;目录中组操作表
struct configfs_attribute **ct_attrs;目录中属性
};
目录下属性操作表:
struct configfs_item_operations { //config_item 操作表
void (*release)(struct config_item *); //引用计数为0是调用
ssize_t (*show_attribute)(struct config_item *, struct configfs_attribute *,char *); //显示
ssize_t (*store_attribute)(struct config_item *,struct configfs_attribute *,const char *, size_t);//存储
int (*allow_link)(struct config_item *src,struct config_item *target);
int (*drop_link)(struct config_item *src,struct config_item *target);
};
属性(文件):目录下文件
struct configfs_attribute {
char *ca_name;
struct module *ca_owner;
umode_t ca_mode;
};
配置组:
struct config_group {
struct config_itemcg_item;组中主目录
struct list_headcg_children; 子目录链表
struct configfs_subsystem *cg_subsys; 所属配置子系统
struct config_group**default_groups;
};
初始化config_group:
void config_group_init(struct config_group *group);
初始化group, item, item_type:
void config_group_init_type_name(struct config_group *group,const char *name,struct config_item_type *type);
组操作表:
struct configfs_group_operations {
struct config_item *(*make_item)(struct config_group *group,const char *name); 创建目录 mkdir调用
struct config_group *(*make_group)(struct config_group *group,const char *name);变成一个group
int (*commit_item)(struct config_item *item);
void (*disconnect_notify)(struct config_group *group,struct config_item *item); 用来删除前的清理工作
void (*drop_item)(struct config_group *group,struct config_item *item); 删除目录,rmdir调用
};
配置子系统:
struct configfs_subsystem {
struct config_groupsu_group;
struct mutex su_mutex;
};
注册一个configfs子系统:
int configfs_register_subsystem(struct configfs_subsystem *subsys);
注销:
void configfs_unregister_subsystem(struct configfs_subsystem *subsys);