您的位置:首页 > 运维架构 > Linux

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

2015-06-04 11:11 851 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: