sysfs 和 debugfs
一、概述
内核中有三个常用的伪文件系统:procfs,debugfs和sysfs。
- procfs — The proc filesystem is a pseudo-filesystem which provides an interface to kernel data structures.
- sysfs — The filesystem for exporting kernel objects.
- debugfs — Debugfs exists as a simple way for kernel developers to make information available to user space.
它们都用于Linux内核和用户空间的数据交换,但是适用的场景有所差异:
- procfs 历史最早,最初就是用来跟内核交互的唯一方式,用来获取处理器、内存、设备驱动、进程等各种信息。
- sysfs 跟 kobject 框架紧密联系,而 kobject 是为设备驱动模型而存在的,所以 sysfs 是为设备驱动服务的。
- debugfs 从名字来看就是为debug而生,所以更加灵活。
不过,默认情况下,它们分别挂载在/proc,/sys/,/sys/kernel/debug/。
下面简单介绍这三个文件系统的用法(procfs已经单独学习过了,这里就不再赘述了)。在介绍之前,请记下他们的官方文档:
- procfs — Documentation/filesystems/proc.txt
- sysfs — Documentation/filesystems/sysfs.txt
- debugfs — Documentation/filesystems/debugfs.txt
二、sysfs
许多较新的Linux发行版使用安装在/sys上的sysfs作为从内核向各种应用程序导出信息的一种方式。sysfs一般包含9个顶级目录:
sysfs是一个基于内存的文件系统,同devfs、procfs一样被称之为虚拟文件系统,和ext系列、fat等文件系统不同的是,sysfs这一类的虚拟文件系统是在启动时构建在内存中的。sysfs文件系统一般挂载于/sys目录下,既然是存储于内存中,自然掉电不保存,不能存储用户数据,实际上,在这之前,也有虚拟文件系统建立了内核与用户系统信息的交互,它就是procfs,但是procfs并非针对设备和驱动程序,而是针对整个内核信息的抽象接口。
它作为proc的优化,作用是:内核中设备的一些属性、数据以文件的方式导出到应用空间,这些文件称为属性文件,读这些属性文件就表示读取设备的属性信息,相反写属性文件就表示对设备的属性进行设置、以控制设备的状态。不同于procfs,sysfs可以产生一个包含所有系统硬件层次视图,它把连接在系统上的设备和总线组织成为一个分级的文件,它们可以由用户空间存取,向用户空间导出内核的数据结构以及它们的属性。sysfs的一个目的就是展示设备驱动模型中各组件的层次关系,其顶级目录包括block,bus,drivers,class,power和firmware等.sysfs提供一种机制,使得可以显式的描述内核对象、对象属性及对象间关系。sysfs有两组接口,一组针对内核,用于将设备映射到文件系统中,另一组针对用户程序,用于读取或操作这些设备。
sysfs 文件系统把连接在系统上的设备和总线组织成为一个分级的文件、 展示设备驱动模型中各组件的层次关系。 sysfs 提供了一种机制,可以显式的描述内核对象, 用来导出内核对象(例如一个硬件设备)的数据、属性到用户空间,以文件目录结构的形式为用户空间提供对这些数据、属性的访问支持。
下图描述了内核对象、对象属性及对象间关系在用户空间 sysfs 中的的表现:
下图描述了内核对象、对象属性及对象间关系在用户空间 sysfs 中的的表现:
1、目录简介
/sys/block:包含已知的块设备 /sys/bus:包含所有注册的总线。 /sys/class:包含设备 /sys/device:内核知道的所有设备,由它们连接的总线组织 /sys/firmware:包含一些设备的固件文件 /sys/fs:包含用于控制文件系统的文件 /sys/kernel:各种内核相关文件 /sys/module:加载内核模块。每个模块由同名目录表示。 /sys/power:处理系统电源状态的各种文件
2、API
struct kobject *kobject_create_and_add(const char *name, struct kobject *parent) int sysfs_create_file(struct kobject * kobj, const struct attribute * attr) static inline int sysfs_create_link(struct kobject *kobj, struct kobject *target, const char *name) int device_create_file(struct device *dev, const struct device_attribute *attr)