Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >嵌入式Linux:应用层与底层硬件进行交互或控制的两种主要方式

嵌入式Linux:应用层与底层硬件进行交互或控制的两种主要方式

作者头像
不脱发的程序猿
发布于 2025-03-14 09:35:56
发布于 2025-03-14 09:35:56
10500
代码可运行
举报
运行总次数:0
代码可运行

Linux系统中,应用层需要与底层硬件进行交互或控制,通常有两种主要方式:

  • /dev目录下的设备文件(设备节点)
  • /sys目录下设备的属性文件

这两种方式都可以为应用程序提供访问硬件的接口,但它们在设计目的、访问方式以及使用场景上有所不同。

1、/dev 目录下的设备文件(设备节点)

在Linux系统中,硬件设备通常通过设备文件的形式在/dev目录下表示。

设备文件种类

说明

常见示例

使用场景

字符设备

通过字节流方式访问的设备文件,支持顺序读取和写入操作。

/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

直接访问系统内存、生成随机数据流

这些设备文件本质上是特殊类型的文件,用于映射实际的硬件设备,以便应用层能够通过系统调用与硬件进行交互。

特点:

  • 访问方式:应用程序可以通过文件操作函数(如open、read、write等)直接对设备文件进行操作。这种操作通过内核中的驱动程序将操作指令转发到实际的硬件。
  • 设备类型:设备文件分为两类:字符设备(如串口设备/dev/ttyS*)和块设备(如磁盘设备/dev/sda)。字符设备通常是字节流数据,块设备通常支持随机访问。
  • 驱动作用:设备文件通常依赖设备驱动程序来完成硬件控制和数据传输。驱动程序在应用层的操作与硬件之间进行中介,处理低级别的硬件操作细节。
  • 访问权限:设备文件有严格的权限控制,通常只有超级用户或特定用户组有权限直接操作。

使用场景:

  • 文件读写:例如访问串口或传感器数据,程序通过读取/dev下对应的设备文件获取数据。
  • 块设备操作:如挂载磁盘分区或访问存储设备时,操作文件系统涉及的底层硬件设备。
  • 需要底层驱动支持的设备:多数需要通过驱动程序管理的硬件(如显卡、音频设备等)都依赖设备文件。

示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 通过读取字符设备文件来获取设备数据
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

显示和配置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

驱动管理、调试驱动程序

sysfs是Linux内核的一种虚拟文件系统,用于展示内核对象(如设备和驱动程序)的层次结构信息。

特点:

  • 设备属性和配置:/sys目录中提供的设备属性文件可用于查看和修改设备的配置参数。例如,可以查看或调整设备的功耗模式、速度、状态等。
  • 实时更新:由于/sys中的文件是虚拟文件,数据会在访问时实时更新,提供当前设备的状态信息。
  • 只读和读写属性:/sys中的文件分为只读属性(如设备信息)和可读写属性(如功耗模式)。用户可以通过写入方式修改设备的部分配置。
  • 标准化接口:相比直接通过设备文件访问硬件,sysfs为不同类型设备提供了更为标准的访问接口,尤其适合用于系统管理和设备调试。

使用场景:

  • 系统配置和监控:适合应用程序获取设备的当前状态、序列号、版本信息、功耗管理等属性数据。
  • 设备驱动开发和调试:驱动开发人员常用sysfs在开发过程中验证设备的状态、检查错误信息或调试驱动程序。
  • 电源管理和设备配置:应用层可以通过更改设备的sysfs文件来控制设备状态,例如将设备置为低功耗模式或调整性能参数。

示例:

查看CPU频率cat :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq

设置某个设备的功耗模式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
echo "low_power" > /sys/devices/pci0000:00/0000:00:1f.3/power/control

在实际开发中,两者可以配合使用。

/dev设备文件适合于直接的数据传输和低延迟的控制操作,而/sys属性文件适合用于管理、监控以及修改设备的高层配置。

特性

/dev 设备文件

/sys 属性文件

访问方式

直接进行文件读写

读取/写入属性文件

依赖驱动

是,依赖驱动支持设备文件的操作

是,sysfs属性由驱动创建和管理

使用场景

主要用于数据传输和底层操作

主要用于配置、监控和状态读取

适合场景

文件操作或直接设备控制

设备信息查询、属性配置

权限控制

严格的权限控制

多数属性文件开放查询,部分可写

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-03-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 美男子玩编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验