io和devmem是什么
1. devmem 是什么?
devmem 既可以指 Linux 系统中的设备节点 /dev/mem,也指代一个命令行工具。
/dev/mem设备节点:这是 Linux 内核提供的一个字符设备,它是系统物理内存的镜像。devmem命令行工具:它通常是 BusyBox 自带的一个标准 applet。它通过对/dev/mem执行mmap()操作,将物理地址映射到虚拟地址,从而让开发者可以在终端里直接修改物理内存。- 典型用法:
# 读取物理地址 0xFE000000 的 32 位(字)数据
devmem 0xFE000000 32
# 向该地址写入 0x00000001
devmem 0xFE000000 32 0x00000001
2. io 是什么?
io 也是一个功能极简的命令行工具,通常由单文件 C 代码(io.c)编译而来。
- 来源:它不是 Linux 或 BusyBox 的标准组件,而是广大嵌入式开发者、底板厂商或芯片原厂(如 SoC 的 BSP 源码包中)经常自带并编译进去的一个独立工具。
- 特点:它的诞生往往是因为某些早期版本的 BusyBox 没有包含
devmem,或者开发者觉得devmem的语法不够顺手。有些io工具对按字节(8-bit)、半字(16-bit)、字(32-bit)的读写参数设计得更直观。 - 典型用法(不同版本的
io参数可能略有不同):
# 读取 32 位寄存器 (-4 表示 4 bytes)
io -4 -r 0xFE000000
# 写入寄存器
io -4 -w 0xFE000000 0x00000001
核心对比:为什么它们会被混淆?
| 维度 | devmem |
io |
|---|---|---|
| 底层实现机制 | open("/dev/mem") + mmap() |
open("/dev/mem") + mmap() |
| 主要应用场景 | 调试 ARM/RISC-V 等架构 SoC 的外设寄存器(如 GPIO、I2C、CAN 的控制器寄存器),绕过内核驱动直接读取硬件状态或写入配置。 | 同左。用于快速验证硬件连线或控制器死锁状态。 |
| 软件来源 | 通常集成在 BusyBox 中。 | 通常是独立的第三方 io.c 编译产物,或者原厂 BSP 夹带。 |
| 危险性 | 极高。直接操作物理地址,如果写错地址可能会导致系统立刻内核崩溃(Kernel Panic)或硬件锁死。 | 极高。 |
总结:
如果你在调试一块开发板,发现系统里有 devmem 却没有 io,或者有 io 却没有 devmem,这完全不影响你的工作。你只需要查看一下当前存在那个工具的 help 说明,它们在排查硬件 I/O 地址空间(MMIO)时的作用是可以完全等价替换的。
留下评论