• sysfs 文件系统


    活动地址:CSDN21天学习挑战赛

    由来

      sysfs 文件系统是 Linux 众多文件系统中的一个。在 Linux 系统中,每一个文件系统都有其特殊的用途,如 ext2 用于快速读写存储文件,ext3 用来记录日志文件。
      Linux 设备驱动模型由大量的数据结构和算法组成。这些结构之间的关系非常复杂,多数结构之间通过指针互相关联,构成树型或者网状关系。显示这种关系的最好方法是利用一种树型的文件系统,但是这种文件系统需要具有其它文件系统没有的功能,例如显示内核中的一些关于设备、驱动和总线的信息。
      为了达到这个目的,Linux 内核开发者创建了一种新的文件系统,这就是 sysfs 文件系统。

    特性

      sysfs 文件系统是 Linux 2.6 内核的一个新特性,它是一个只存在于内存中的文件系统。内核通过这个文件系统将信息导出到用户空间中。
      sysfs 文件系统目录之间的关系非常复杂,各目录与文件之间既有树型关系,又有目录关系。在内核中,这种关系由设备驱动模型来表示。
      在 sysfs 文件系统中产生的文件大多数是 ASCII 文件,通常每个文件有一个值,而且易于访问。
      Linux 设备模型如同一栋规模宏大的建筑,为了构建它,除了基本的建筑材料(kobject、kset 等基础数据结构)外,尚需要一种机制,来向建筑外面的世界(用户空间程序)展示内部的构造,并且通过文件接口的方式实现与外界的沟通与互动。sysfs 文件系统就充当了这种角色。
      透过 sysfs 文件系统可以取代 ioctl 的功能,如果想向一个设备文件发送 ioctl 命令的话,首先需要打开该设备文件,然后再通过 ioctl 函数向设备发出命令,很显然需要一个完整(虽然代码可能很简单)的应用程序来做这件事。现在有了 sysfs 文件系统,一个很简单的 shell 命令也许就可以完成前面所说的工作。
      对于用户进程中的文件系统来说,sysfs 的标准挂载点是 /sys 目录,将 sysfs 文件系统挂载到用户进程的 /sys 目录的命令为 mount -t sysfs sysfs /sys。如此,所有内核层面的对 sysfs 文件树的操作,都将一成不变地显示在用户空间的 /sys 目录下。

    目录

      sysfs 文件系统与其它文件系统一样,由目录、文件、链接组成。sysfs 文件系统只存在于内存中,动态的表示着内核的数据结构。
      sysfs 文件系统挂接了一些子目录,这些目录代表了注册在 sysfs 中主要的子系统。

    # ls /sys/
    block  bus  class  dev  devices  firmware  fs  kernel  module  power
    
    • 1
    • 2

    block

    block 目录包含了在系统中发现的每个块设备,每个块设备对应一个子目录。每个块设备的目录中有各种属性,描述了设备的各种信息。例如设备的名称、大小、设备号等。

    # cat /sys/block/mmcblk1/device/name 
    8GTF4R
    # cat /sys/block/mmcblk0/device/name 
    SD8GB
    
    • 1
    • 2
    • 3
    • 4

    bus

    bus 目录包含了在内核中注册而得到支持的每个物理总线的子目录,例如 ide、pci、scsi、usb、i2c、sdio 总线等。

    # ls /sys/bus/
    clockevents  clocksource  container  cpu  event_source  hid  i2c  mdio_bus  mmc  platform  rpmsg  scsi  sdio  serio  soc  spi  usb  virtio  workqueue
    
    • 1
    • 2

    其中每个目录中的结构都大同小异。这里以 usb 目录为例,分析其目录结构关系。

    # ls /sys/bus/usb/
    devices  drivers  drivers_autoprobe  drivers_probe  uevent
    
    • 1
    • 2

    usb 目录中包含了 devices 和 drivers 目录。devices 目录包含了 USB 总线下所有的设备,这些设备实际上是指向 devices 目录中相应设备的符号链接。

    # ls /sys/bus/usb/devices/ -l
    total 0
    lrwxrwxrwx 1 root root 0 Aug 19 19:39 1-0:1.0 -> ../../../devices/platform/soc/2100000.aips-bus/2184200.usb/ci_hdrc.1/usb1/1-0:1.0
    lrwxrwxrwx 1 root root 0 Aug 19 19:39 1-1 -> ../../../devices/platform/soc/2100000.aips-bus/2184200.usb/ci_hdrc.1/usb1/1-1
    lrwxrwxrwx 1 root root 0 Aug 19 19:39 1-1:1.0 -> ../../../devices/platform/soc/2100000.aips-bus/2184200.usb/ci_hdrc.1/usb1/1-1/1-1:1.0
    lrwxrwxrwx 1 root root 0 Aug 19 19:39 usb1 -> ../../../devices/platform/soc/2100000.aips-bus/2184200.usb/ci_hdrc.1/usb1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    其中 1-0:1.0 和 1-1:1.0 是 USB 设备的名称,这些名称由 USB 协议规范来定义。链接的目的是为了构建 sysfs 文件系统的层次结构。
    drivers 目录包含了 USB 总线下注册时所有驱动程序的目录。每个驱动目录中,有允许查看和操作设备参数的属性文件,和指向该设备所绑定的物理设备的符号链接。

    # ls /sys/bus/usb/drivers/usb/ -lh
    total 0
    lrwxrwxrwx 1 root root    0 Aug 19 23:18 1-1 -> ../../../../devices/platform/soc/2100000.aips-bus/2184200.usb/ci_hdrc.1/usb1/1-1
    --w------- 1 root root 4.0K Aug 19 23:18 bind
    --w------- 1 root root 4.0K Aug 19 23:18 uevent
    --w------- 1 root root 4.0K Aug 19 23:18 unbind
    lrwxrwxrwx 1 root root    0 Aug 19 23:18 usb1 -> ../../../../devices/platform/soc/2100000.aips-bus/2184200.usb/ci_hdrc.1/usb1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    class

    class 目录中的子目录表示每一个注册到内核中的设备类。例如固件类(firmware)、混杂设备类(misc)、图形类(graphics)、声音类(sound)、和输入类(input)等。

    # ls /sys/class/
    ata_device  backlight  dma       gpio      ieee80211  leds      misc      net           ptp  regulator  scsi_device  sound       tty  vc           watchdog
    ata_link    bdi        drm       graphics  input      mdio_bus  mmc_host  power_supply  pwm  rfkill     scsi_disk    spi_master  ubi  video4linux
    ata_port    block      firmware  i2c-dev   lcd        mem       mtd       pps           rc   rtc        scsi_host    thermal     udc  vtconsole
    
    • 1
    • 2
    • 3
    • 4

    dev

    该目录下有很多以主设备号:次设备号(major:minor)命名的文件,这些文件都链接到 /sys/devices 目录下对应的设备。

    # ls /sys/dev/char/
    10:130  10:237  10:61  1:11    13:64  1:8    207:16  252:0  254:0  4:10  4:14  4:18  4:21  4:25  4:29  4:32  4:36  4:4   4:43  4:47  4:50  4:54  4:58  4:61  4:8  5:2    7:129  89:0
    10:183  10:58   10:62  116:33  13:65  189:0  207:18  252:1  29:0   4:11  4:15  4:19  4:22  4:26  4:3   4:33  4:37  4:40  4:44  4:48  4:51  4:55  4:59  4:62  4:9  7:0    7:130  89:1
    10:229  10:59   10:63  1:3     1:5    189:1  226:0   253:0  4:0    4:12  4:16  4:2   4:23  4:27  4:30  4:34  4:38  4:41  4:45  4:49  4:52  4:56  4:6   4:63  5:0  7:1    7:2
    10:235  10:60   1:1    13:63   1:7    1:9    251:0   253:1  4:1    4:13  4:17  4:20  4:24  4:28  4:31  4:35  4:39  4:42  4:46  4:5   4:53  4:57  4:60  4:7   5:1  7:128  81:0
    # ls /sys/dev/block/
    1:0  1:10  1:12  1:14  1:2  1:4  1:6  179:0  179:16  179:18  179:32  179:64  1:9  7:1  7:3  7:5  7:7
    1:1  1:11  1:13  1:15  1:3  1:5  1:7  179:1  179:17  179:2   179:48  1:8     7:0  7:2  7:4  7:6
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    device

    这是系统中所有设备存放的目录,也就是系统中所有设备在 sysfs 中的呈现、表达,也是 sysfs 管理设备的最重要的目录结构。

    firmware

    firmware 目录下有两个文件:devicetree 和 fdt。
    fdt 是原始 dtb 文件,可以用 hexdump -C fdt 将其打印出来看,就会发现里面的数据和 dtb 文件时一致的。
    devicetree 以目录结构呈现 dtb 文件。根节点对应 base 目录,每一个节点对应一个目录,每一个属性对应一个文件。
    /proc/device-tree 指向 /sys/firmware/devicetree/base

    fs

    用于描述系统中的文件系统

    kernel

    存放内核所有可调整的参数

    module

    该目录下有系统中所有的模块信息,不论这些模块是静态编译进内核的还是动态加载到内核的。

    power

    系统中的电源选项,对正使用的 power 子系统的描述。这个目录下有几个属性文件可以用于控制整个机器的电源状态,如可以向其中写入控制命令让机器关机/重启等等。

  • 相关阅读:
    Leetcode刷题Day2----数组
    7个教师常备资源网站,质量高还免费,请低调使用
    分类预测 | Matlab实现SSA-SVM多特征分类预测
    java毕业设计淮安市教育局职业教研室技能竞赛Mybatis+系统+数据库+调试部署
    Python爬虫获取淘宝商品详情页数据|实现自动化采集商品信息
    Jetson Nano 系列之:C通过内存映射操作GPIO
    基于51单片机的智能路灯控制系统(lunwen+设计说明+仿真+程序)
    Spark - 一文搞懂 parquet
    Docker 安装 Nginx 容器 (完整详细版)
    Kotlin高仿微信-第22篇-个人信息-修改昵称
  • 原文地址:https://blog.csdn.net/lyndon_li/article/details/126432157