在Linux系统中,应用层需要与底层硬件进行交互或控制,通常有两种主要方式:
这两种方式都可以为应用程序提供访问硬件的接口,但它们在设计目的、访问方式以及使用场景上有所不同。
1
/dev 目录下的设备文件(设备节点)
在Linux系统中,硬件设备通常通过设备文件的形式在/dev目录下表示。
字符设备 | /dev/ttyS0 | ||
块设备 | /dev/sda | ||
网络设备 | /dev 中通常不直接包含网络设备文件,但可以通过特殊设备实现,如虚拟网络接口。 | /dev/tun0 | |
伪设备 | /dev/null /dev/zero | ||
输入设备 | /dev/input/mice | ||
音频设备 | /dev/audio /dev/snd | ||
图像设备 | /dev/video0 | ||
打印机设备 | /dev/lp0 | ||
磁带设备 | /dev/st0 | ||
GPU设备 | /dev/dri/card0 | ||
特殊系统设备 | /dev/mem /dev/random |
这些设备文件本质上是特殊类型的文件,用于映射实际的硬件设备,以便应用层能够通过系统调用与硬件进行交互。
特点:
使用场景:
示例:
// 通过读取字符设备文件来获取设备数据
int fd = open("/dev/ttyS0", O_RDONLY);
if (fd != -1) {
char buffer[128];
read(fd, buffer, sizeof(buffer));
close(fd);
}
2
/sys 目录下的设备属性文件
/sys目录提供了一个文件系统接口(通常称为sysfs),允许应用程序查看和控制内核的设备属性。
CPU | /sys/devices/system/cpu | ||
内存 | /sys/devices/system/memory | ||
PCI设备 | /sys/bus/pci/devices | ||
USB设备 | /sys/bus/usb/devices | ||
电池 | /sys/class/power_supply | ||
网络接口 | /sys/class/net | ||
SCSI设备 | /sys/class/scsi_device | ||
块设备 | /sys/class/block | ||
输入设备 | /sys/class/input | ||
图形设备 | /sys/class/drm | ||
音频设备 | /sys/class/sound | ||
温度传感器 | /sys/class/thermal | ||
功率管理设备 | /sys/class/power_supply | ||
LED设备 | /sys/class/leds | ||
固件 | /sys/class/firmware | ||
驱动信息 | /sys/bus/*/drivers |
sysfs是Linux内核的一种虚拟文件系统,用于展示内核对象(如设备和驱动程序)的层次结构信息。
特点:
使用场景:
示例:
查看CPU频率cat :
/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq
设置某个设备的功耗模式:
echo "low_power" > /sys/devices/pci0000:00/0000:00:1f.3/power/control
在实际开发中,两者可以配合使用。
/dev设备文件适合于直接的数据传输和低延迟的控制操作,而/sys属性文件适合用于管理、监控以及修改设备的高层配置。
访问方式 | ||
依赖驱动 | ||
使用场景 | ||
适合场景 | ||
权限控制 |