Linux 虚拟文件系统支持的文件系统类型-3----sysfs && procfs

        procfs和sysfs等,这几种虚拟文件系统都并不实际存储在硬盘上,而是Linux内核运行起来后才建立起来。procfs系统sysfs系统 都用于Linux内核和用户空间的数据交换,但是适用的场景有所差异。

 (类似的还有DebugFS,顾名思义,是一种用于内核调试的虚拟文件系统,内核开发者通过debugfs和用户空间交换数据)


一、procfs系统

       procfs 历史最早,最初就是用来跟内核交互的唯一方式,用来获取处理器、内存、设备驱动、进程等各种信息。



二、sysfs系统

1.基础简介

     sysfs 跟 kobject 框架紧密联系,而 kobject 是为设备驱动模型而存在的,所以 sysfs 是为设备&&驱动服务的。

     sysfs是Linux 2.6所提供的一种虚拟档案系统。这个档案系统不仅可以把装置(devices)驱动程式(drivers)的资讯从kernel space输出到user space,也可以用来对装置和驱动程式做设定。

  sysfs 的目的是把一些原本在 procfs中的,关于装置的部份独立出来,以[装置阶层架构}(device tree)的形式呈现。这个档案系统由Patrick Mochel 所写,稍后Maneesh Soni 撰写 "sysfs backing store path",以降低在大型系统中对内存的需求量。


2.example(sysfs接口的实现):

        1.  基本知识:sysfs接口,涉及到函数宏 DEVICE_ATTR(对设备的使用),BUS_ATTR(对总线使用), DRIVER_ATTR(对驱动使用), CLASS_ATTR(对类别 (class) 使用),  这四个高级的宏来自于<include/linux/device.h> 。

        以函数宏 DEVICE_ATTR(对设备的使用)为例子进行说明,其原型是#define DEVICE_ATTR(_name, _mode, _show, _store) \,而DEVICE_ATTR内封装的是__ATTR(_name,_mode,_show,_stroe)方法,_show表示的是读方法,_stroe表示的是写方法。DEVICE_ATTR  宏声明有四个参数,分别是名称、权限位、读函数、写函数。其中读函数和写函数是读写功能函数的函数名。

         2.sysfs创建目录和文件节点:

         (1)在sys下,建立power 目录 power_kobj = kobject_create_and_add("power", NULL);

         (2)在power目录下建立,几个设备文件sysfs_create_group(power_kobj, &attr_group);


static struct attribute_group attr_group = {
    .attrs = g,
};

static struct attribute * g[ ] = {
        &state_attr.attr,
#ifdef CONFIG_PM_TRACE
        &pm_trace_attr.attr,
        &pm_trace_dev_match_attr.attr,
#endif
#ifdef CONFIG_PM_SLEEP
        &pm_async_attr.attr,
        &wakeup_count_attr.attr,
#ifdef CONFIG_PM_DEBUG
        &pm_test_attr.attr,
#endif
#ifdef CONFIG_USER_WAKELOCK
        &wake_lock_attr.attr,
        &wake_unlock_attr.attr,
#endif
#endif
        NULL,
};


power_attr(pm_trace_dev_match);


#define power_attr(_name) \
static struct kobj_attribute _name##_attr = {   \
        .attr   = {                             \
                .name = __stringify(_name),     \
                .mode = 0644,                   \
        },                                      \
        .show   = _name##_show,                 \
        .store  = _name##_store,                \
}      


static ssize_t pm_trace_dev_match_show(struct kobject *kobj,
                       struct kobj_attribute *attr,
                       char *buf)
{
    return show_trace_dev_match(buf, PAGE_SIZE);/内核实现
}

static ssize_t  pm_trace_dev_match_store(struct kobject *kobj, struct kobj_attribute *attr,
             const char *buf, size_t n)
{
    return -EINVAL;
}


       
3.example(对sysfs接口的使用):

   在Sensor驱动,里面实现的全都是sysfs接口,hal层利用sysfs生成的接口,对Sensor进行操作。


    open("/sys/xx");  read();write();


    或者直接采用  cat   xx   和  echo  xx  > xx




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值