简单的说,sysfs是一个基于内存的文件系统,它的作用是将内核信息以文件的方式提供给用户程序使用。
sysfs可以看成与proc,devfs和devpty同类别的文件系统,该文件系统是虚拟的文件系统,可以更方便对系统设备进行管理。它可以产生一个包含所有系统硬件层次视图,与提供进程和状态信息的proc文件系统十分类似。
sysfs把连接在系统上的设备和总线组织成为一个分级的文件,它们可以由用户空间存取,向用户空间导出内核的数据结构以及它们的属性。sysfs的一个目的就是展示设备驱动模型中各组件的层次关系,其顶级目录包括block,bus,drivers,class,power和firmware等.
sysfs提供一种机制,使得可以显式的描述内核对象、对象属性及对象间关系。sysfs有两组接口,一组针对内核,用于将设备映射到文件系统中,另一组针对用户程序,用于读取或操作这些设备。下面描述了内核中的sysfs要素及其在用户空间的表现:
sysfs在内核中的组成要素 | 在用户空间的显示 |
内核对象(kobject) | 目录 |
对象属性(attribute) | 文件 |
对象关系(relationship) | 链接(Symbolic Link) |
sysfs核心负责为内核中的内部表示和用户空间的外部呈现建立对应关系
1 内核对象被映射为用户空间的目录;
2 对象属性被映射为用户空间的常规文件
3 对象关系被映射为用户空间的符号链接
sysfs代码在fs/sysfs中,他提供两种构件,也就是两个方面的API,一是内核编程接口,用于向内核其他模块提供构建内部树的API,另一是文件系统接口,使得用户空间可以查看并操作对应的内核对象
构建内核对象,对象属性和对象关系
sysfs内部树中有4种类型的节点:目录节点,链接节点,属性节点和二进制属性节点,分别对应内核对象,对象关系,对象属性,内部树的所有节点都是用sysfs_dirent描述符表示,根保存在全局变量sysfs_root中。
每个目录节点都对应一个kobject结构,而属性节点则会包含attribute结构,没有kobject结构。
内核对象
数据结构为kobject,在内部用一个目录节点表示,由sysfs文件系统作为目录输出到用户空间,由于是目录节点,他下面将会创建其他的节点(链接节点,属性节点,二进制节点)。表示目录节点的数据结构是sysfs_elem_dir,其children域指向他第一个孩子节点,沿着孩子节点的s_sibling组成一个链表。
sysfs_dirent
sysfs_dirent是组成sysfs单元的基本数据结构,它是sysfs文件夹或文件在内存中的代表。sysfs_dirent只表示文件类型(文件夹/普通文件/二进制文件/链接文件)及层级关系,其它信息都保存在对应的inode中。我们创建或删除一个sysfs文件或文件夹事实上只是对以sysfs_dirent为节点的树的节点的添加或删除。
相互关系
创建文件即是在kobject对应的目录下增加属性文件。
创建bin文件即是在kobject对应的目录下增加bin属性文件。
创建链接是创建一个连接指向对应的kobject创建的目录.
创建属性组即首先创建一个目录,然后在该目录内依次添加所有属性文件
并且这些创建都需要在kobject注册之后使用/inlude/linux/sysfs.h中定义的接口函数和kobject进行添加。
引用网友的一个结构图: