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 中的的表现:



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)





全部评论

相关推荐

06-02 15:17
门头沟学院 Java
心爱的idea:怎么会呢 应该是打招呼有问题 问就说实习6个月全国可飞随时到岗
点赞 评论 收藏
分享
小鹏、大疆、米哈游、MinMax小鹏上午投的下午就约面,进度未免也太快了
蛇年行大运fff:哥们 盗贴有意思吗,我发xhs上的给你搬过来了😅😅😅
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务