Linux configfs和sysfs的使用与理解

Linux configfs和sysfs的区别与使用

目录

1 概述

2 configfs与sys

3 configfs

3.1 configfs介绍

3.2 基本使用结构原理

3.3 使用与示例

4 sysfs

4.1 sysfs文件系统介绍

4.2 示例

5 引用参考


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,
    .drop_item = &testfs_drop,
};
static struct config_item_type testfs_type = {
    .ct_group_ops = &testfs_ops,
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值