1. 什么是 sysfs伪文件系统?
sysfs
是 Linux 内核提供的 伪文件系统,用于向用户空间暴露内核对象的信息和控制接口。它是 procfs
的补充,主要用于管理 设备、驱动、内核子系统 等信息,使用户可以通过文件操作(如用户空间中的open函数、write函数、read函数、 cat
命令、echo
命令)与内核交互【对文件的操作其实直接转换为调用相应的内核函数】,而无需编写内核代码。
- 挂载位置:通常挂载在
/sys
目录下。 - 作用:
- 提供系统信息(如 CPU、设备、驱动程序、总线)。
- 提供设备控制接口(如 GPIO、PWM、I2C、SPI 等)。
- 支持热插拔设备管理(如 USB、PCI、SATA 设备)。
sysfs伪文件系统实际上和设备文件很类似,它们都是用户空间与内核空间交互的媒介,不同的是设备文件是内核空间中驱动程序中的概念,而sysfs伪文件系统则是内核空间中别的需要向用户空间暴露的内核对象的信息和控制接口。所以它的使用实际上和设备文件很类似。
在终端中使用sysfs伪文件系统时,表面上我们是在用相关函数或cat
、echo
命令进行读或写相关的文件,实际上会转换为对某个内核函数的调用。具体的例子见本篇博文后面列出的“一个实际的例子分析”
而在程序代码中使用sysfs伪文件系统时,就和操作设备文件差不多。具体的例子见 https://blog.youkuaiyun.com/wenhao_ir/article/details/145459006【搜索“led_init(void)”】
2. sysfs 的目录结构
sysfs 目录下的结构主要分为以下几部分:
/sys/
├── block/ # 块设备(如磁盘、分区)
├── bus/ # 设备总线(如 i2c, usb, spi, pci, platform)
├── class/ # 设备类(如 gpio, net, tty, input)
├── devices/ # 设备层次结构
├── firmware/ # 固件接口
├── kernel/ # 内核参数
├── module/ # 加载的内核模块
└── power/ # 电源管理
3. sysfs 目录详解
(1)/sys/class/
-
组织 设备 按类别分类(如 GPIO、网络、输入设备)。
-
例子:
ls /sys/class/
输出:
gpio/ net/ input/ sound/ thermal/ tty/ usb_device/
-
GPIO 设备(使用 sysfs 方式操作 GPIO)
echo 131 > /sys/class/gpio/export # 申请 GPIO 131 echo out > /sys/class/gpio/gpio131/direction # 设置方向 echo 1 > /sys/class/gpio/gpio131/value # 设为高电平
我后面会对这三句命令作详细解释,其实就是以这三句命令活生生地展现 sysfs 伪文件系统是怎么实现与内核的交互的。
-
网卡信息
ls /sys/class/net/ eth0 lo wlan0
cat /sys/class/net/eth0/address
# 查看 MAC 地址cat /sys/class/net/eth0/statistics/rx_bytes
# 接收的字节数
(2)/sys/bus/
-
组织 设备按总线分类(如 PCI、USB、I2C、SPI)。
-
例子:
ls /sys/bus/
输出:
i2c/ pci/ platform/ scsi/ spi/ usb/
/sys/bus/i2c/devices/
# I2C 设备/sys/bus/usb/devices/
# USB 设备/sys/bus/pci/devices/
# PCI 设备
-
示例:列出所有 USB 设备
ls /sys/bus/usb/devices/
(3)/sys/devices/
-
按 设备拓扑结构 组织设备信息(如
/sys/devices/pci0000:00/0000:00:1f.2/
)。 -
例子:
ls /sys/devices/