|
liradm3uego64010620.gif
9 H; c1 g; P2 N9 ]6 l点击上方蓝色字体,关注我们, x, W2 Z3 S8 j: x% N6 t5 p
7 o3 V) e# ]% ^6 H
这两种方式都可以为应用程序提供访问硬件的接口,但它们在设计目的、访问方式以及使用场景上有所不同。6 |2 k" U# x% X
1: C# k: M$ d' N* Q: d
/dev 目录下的设备文件(设备节点)' u$ d3 C- G5 p$ c" Y& n
在Linux系统中,硬件设备通常通过设备文件的形式在/dev目录下表示。! b4 L" {6 ?" i/ F% M% d# H/ u
$ N1 x* K6 n1 A+ K0 v
设备文件种类 | 说明 | 常见示例 | 使用场景 | 字符设备 | 通过字节流方式访问的设备文件,支持顺序读取和写入操作。 | /dev/ttyS0(串口) | 串口通信、传感器数据读取、串行设备数据传输 | 块设备 | 支持以数据块为单位进行随机访问的设备文件,通常用于存储设备。 | /dev/sda(硬盘) | 磁盘读写、文件系统操作、挂载分区 | 网络设备 | 尽管/dev中通常不直接包含网络设备文件,但可以通过特殊设备实现,如虚拟网络接口。 | /dev/tun0(隧道接口) | 网络流量捕获、网络隧道、VPN通信 | 伪设备 | 非真实硬件设备,提供系统功能的接口。 | /dev/null、/dev/zero | 丢弃数据、生成空数据、模拟数据传输 | 输入设备 | 用于提供系统输入功能的设备,如键盘、鼠标。 | /dev/input/mice | 获取鼠标输入、捕获键盘事件 | 音频设备 | 提供音频输入输出接口,支持音频数据的读取和写入。 | /dev/audio、/dev/snd | 音频播放、录音、音频处理 | 图像设备 | 摄像头或图像采集设备,支持图像数据流的传输。 | /dev/video0 | 视频流捕获、摄像头数据获取 | 打印机设备 | 专门用于打印设备的接口,通常是字符设备。 | /dev/lp0 | 打印数据传输、打印机控制 | 磁带设备 | 磁带存储设备,通常用于备份,支持顺序存储。 | /dev/st0 | 数据备份、磁带读写 | GPU设备 | 提供图形处理器的接口,通常用于GPU计算或图形加速。 | /dev/dri/card0 | GPU加速、图形处理、计算密集型任务 | 特殊系统设备 | 提供系统特定功能的接口,如内存访问和随机数生成。 | /dev/mem、/dev/random | 直接访问系统内存、生成随机数据流 |
% ]8 B+ h: Y- |8 A" {( r# T3 l这些设备文件本质上是特殊类型的文件,用于映射实际的硬件设备,以便应用层能够通过系统调用与硬件进行交互。
6 e% i. r4 W4 ?8 }+ @3 a; N; D; Q& ]4 j8 u; U
特点:
* p2 s- [0 X8 ~访问方式:应用程序可以通过文件操作函数(如open、read、write等)直接对设备文件进行操作。这种操作通过内核中的驱动程序将操作指令转发到实际的硬件。设备类型:设备文件分为两类:字符设备(如串口设备/dev/ttyS*)和块设备(如磁盘设备/dev/sda)。字符设备通常是字节流数据,块设备通常支持随机访问。驱动作用:设备文件通常依赖设备驱动程序来完成硬件控制和数据传输。驱动程序在应用层的操作与硬件之间进行中介,处理低级别的硬件操作细节。访问权限:设备文件有严格的权限控制,通常只有超级用户或特定用户组有权限直接操作。9 p. s: q" V5 s1 F
使用场景:
- c, W t! L8 ~文件读写:例如访问串口或传感器数据,程序通过读取/dev下对应的设备文件获取数据。块设备操作:如挂载磁盘分区或访问存储设备时,操作文件系统涉及的底层硬件设备。需要底层驱动支持的设备:多数需要通过驱动程序管理的硬件(如显卡、音频设备等)都依赖设备文件。 D7 R5 k3 H5 H& }! e2 {4 ^7 I
示例:- A* Q4 b4 S! j+ Q% k
- m6 K! ^& K: h1 i' T9 j
// 通过读取字符设备文件来获取设备数据int fd = open("/dev/ttyS0", O_RDONLY);if (fd != -1) { char buffer[128]; read(fd, buffer, sizeof(buffer)); close(fd);}# c( s8 k: s |, X' K/ G
2
, Q: h) k* A5 P" E% `/sys 目录下的设备属性文件
, ^( [1 ` |: ]* W/sys目录提供了一个文件系统接口(通常称为sysfs),允许应用程序查看和控制内核的设备属性。
2 v$ e: T" h+ C- H# J4 v
& Q; c# V" A. f4 M4 k设备类型 | 说明 | 常见路径 | 使用场景 | CPU | 显示和配置CPU属性,包括频率、功耗等。 | /sys/devices/system/cpu | CPU频率调整、功耗管理 | 内存 | 提供内存模块和内存管理相关信息。 | /sys/devices/system/memory | 查询系统内存容量、管理内存模块 | PCI设备 | PCI总线上的设备信息,如显卡、网卡等。 | /sys/bus/pci/devices | 获取PCI设备状态、管理和调试PCI设备 | USB设备 | USB总线上的设备属性,如连接的USB设备信息。 | /sys/bus/usb/devices | 检查USB设备连接状态、设置USB配置 | 电池 | 提供电池的属性和状态,包括电量、状态等(适用于移动设备)。 | /sys/class/power_supply | 电池电量监控、电源管理 | 网络接口 | 提供网络接口的配置信息和状态,包括带宽、状态等。 | /sys/class/net | 获取网络接口信息、网络带宽配置 | SCSI设备 | 提供SCSI总线设备的信息,常用于存储设备。 | /sys/class/scsi_device | 存储设备管理、SCSI硬盘监控 | 块设备 | 用于提供块设备的属性信息,如硬盘、USB存储等设备。 | /sys/class/block | 获取硬盘状态、分区信息、块设备容量 | 输入设备 | 提供输入设备的属性信息,如键盘、鼠标等设备。 | /sys/class/input | 检查输入设备状态、配置输入设备属性 | 图形设备 | 提供GPU和其他图形处理设备的信息。 | /sys/class/drm | 查询GPU状态、显卡属性管理 | 音频设备 | 提供音频设备的属性和配置,如声卡等。 | /sys/class/sound | 音频设备配置、音频流管理 | 温度传感器 | 提供系统温度传感器的属性信息,适合监控系统温度。 | /sys/class/thermal | 获取系统温度、温度监控 | 功率管理设备 | 提供系统功率管理设备的属性,用于功耗和电源管理。 | /sys/class/power_supply | 电源管理、功耗优化 | LED设备 | 提供LED指示灯的属性,允许设置LED亮度和状态。 | /sys/class/leds | 控制系统LED状态、调节LED亮度 | 固件 | 提供固件信息和更新接口,适合固件管理。 | /sys/class/firmware | 查看和更新设备固件 | 驱动信息 | 提供已加载驱动的相关信息,包括每个驱动所支持的设备。 | /sys/bus/*/drivers | 驱动管理、调试驱动程序 |
, F7 P1 j1 C& d2 ~+ |: ^0 G0 L+ Nsysfs是Linux内核的一种虚拟文件系统,用于展示内核对象(如设备和驱动程序)的层次结构信息。
1 t { _& L! i: c! R) w
) D- `! F' o+ P3 M3 E/ i4 Z+ N0 R% P特点:
4 U& H7 q0 N# k0 N) a: v, l设备属性和配置:/sys目录中提供的设备属性文件可用于查看和修改设备的配置参数。例如,可以查看或调整设备的功耗模式、速度、状态等。实时更新:由于/sys中的文件是虚拟文件,数据会在访问时实时更新,提供当前设备的状态信息。只读和读写属性:/sys中的文件分为只读属性(如设备信息)和可读写属性(如功耗模式)。用户可以通过写入方式修改设备的部分配置。标准化接口:相比直接通过设备文件访问硬件,sysfs为不同类型设备提供了更为标准的访问接口,尤其适合用于系统管理和设备调试。' M# x' F5 } j
使用场景:- X0 L2 c* |$ g8 ~
系统配置和监控:适合应用程序获取设备的当前状态、序列号、版本信息、功耗管理等属性数据。设备驱动开发和调试:驱动开发人员常用sysfs在开发过程中验证设备的状态、检查错误信息或调试驱动程序。电源管理和设备配置:应用层可以通过更改设备的sysfs文件来控制设备状态,例如将设备置为低功耗模式或调整性能参数。
$ j: j- j9 ?: C2 U* q, ~示例:
/ S9 \5 v$ c& }' t5 l9 I7 X I4 ^% t+ V' g! x( [
查看CPU频率cat :- N$ W D1 \( I( h5 n! f! U3 p' {9 P
L5 a: G+ g$ b+ R1 l$ \& z9 T: `" A, f9 }
/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq设置某个设备的功耗模式:+ p, Q& |- V1 Q: a. c4 w
2 U$ X W4 H0 t1 @# ^9 \0 k, d* p0 @6 q( b
echo "low_power" > /sys/devices/pci0000:00/0000:00:1f.3/power/control在实际开发中,两者可以配合使用。
4 V* f! g2 `% P. G/ c6 w, Q' v+ ^ V0 k- S4 Y4 N
/dev设备文件适合于直接的数据传输和低延迟的控制操作,而/sys属性文件适合用于管理、监控以及修改设备的高层配置。% v& L/ T1 v2 g0 k. |) d, a
+ U) D2 I F0 L/ f# j0 R9 p特性/dev 设备文件/sys 属性文件访问方式直接进行文件读写读取/写入属性文件依赖驱动是,依赖驱动支持设备文件的操作是,sysfs属性由驱动创建和管理使用场景主要用于数据传输和底层操作主要用于配置、监控和状态读取适合场景文件操作或直接设备控制设备信息查询、属性配置权限控制严格的权限控制多数属性文件开放查询,部分可写
1 p. z' Q5 J- x0 c ?
xukn1ncmsbj64010720.jpg
5 B% P o5 U' e: u2 N* d7 L) v
wjlwd3rasez64010820.gif
" n2 q7 Z6 @& {- b点击阅读原文,更精彩~ |
|