少于 1 分钟阅读 次阅读

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)时的作用是可以完全等价替换的。

留下评论