devmem 和 devmem2 都是 Linux 系统中用于直接从用户空间读写物理内存的强大工具。它们能让你“绕过”常规的驱动和API,直接与硬件“对话”,这对于调试硬件、验证驱动或开发初期原型验证非常有帮助。

在 Intel Altera SoC 的世界里,这两个工具是访问 FPGA 内部逻辑(如 GPIO、UART、DMA 控制器等)映射到 ARM 处理器内存空间的一种快速且直接的方法。你只需要在 Linux 命令行中指定正确的物理地址(例如 LED灯的地址0x20010080),就能像操作普通内存一样读写 FPGA 内部的寄存器。

参考友晶科技的https://github.com/johnnyfan1979/public_doc/blob/main/documentation/DE25_Nano/DE25%20Nano%20Build%20Linux%20image%20from%20scratch.md 教程制作出linux image 以后,怎样在Linux系统起来以后用devmem和devmem2命令访问FPGA端外设呢?

开启 /dev/mem 支持

首先,在内核空间开启/dev/mem支持,devmem和devmem2正是通过它来访问物理内存的。 打开.config 文件添加一行 CONFIG_DEVMEM=y,再添加一行 CONFIG_STRICT_DEVMEM=y。

Screenshot from 2026-06-05 05-30-34

 

 

Screenshot from 2026-06-05 05-30-02

 

集成 devmem  工具

devmem通常集成在Busybox当中,所以需要安装busybox先:

sudo apt install busybox

c81a43b69891f77f695fd5def8b6a033

 验证busybox安装:

image

命令devmem后面跟着如下三个参数:

参数 类型 必选 说明
ADDRESS 十六进制数 要读写的物理内存地址
WIDTH 字符

访问宽度:

• b – 字节 (8-bit)
• h – 半字 (16-bit)
• w – 字 (32-bit) —— 默认值
• l – 长字 (64-bit)

VALUE 十六进制数 要写入的值

通过busybox调用devmem命令写外设:

c48cf7282e9c0068a3a820362414c861

 可以看到sudo busybox devmem 0x20010080 w 0x55命令让一半的灯亮起来,一半灯熄灭了。sudo busybox devmem 0x20010080 w 0xff命令让所有灯亮起来了。

通过busybox调用devmem命令读外设:

8796503bd5d2d1dcd1dd6cdab3a13359

 

 

集成 devmem2  工具

devmem2 安装到目标系统上:

sudo apt-get install devmem2

e173c53bf2b913f5bee17d1d073fc18f

命令devmem2后面跟着如下三个参数:

参数 类型 必选 说明
ADDRESS 十六进制数 要读写的物理地址
WIDTH 字符

访问宽度:

• b – 字节 (8-bit)
• h – 半字 (16-bit)
• w – 字 (32-bit) —— 默认值

VALUE 十六进制数 要写入的值

调用devmem2命令写外设:

a38054ed2d51a4ceb763da0008eeec6d

 调用devmem2命令读外设:

fbe5be008a46bad22e87f31221ed6b6f

 

 devmem 和 devmem2 差异

devmem 和 devmem2 都能读写物理内存,但它们在代码实现、数据宽度是有差别的。另外,devmem 读操作是读,写操作是写;但devmem2的写操作是写入数据前,会自动读取指定地址的当前值,修改特定比特后再写回,这种机制可能导致非预期的硬件行为或写入失败。所以调试的时候建议首选devmem命令。

 

 devmem 和 devmem2源码

devmem源码:

https://github.com/mirror/busybox/blob/master/miscutils/devmem.c

devmem2源码:

https://packages.ubuntu.com/hu/source/questing/all/devmem2 (基本不再维护)