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。


集成 devmem 工具
devmem通常集成在Busybox当中,所以需要安装busybox先:
sudo apt install busybox

验证busybox安装:

命令devmem后面跟着如下三个参数:
| 参数 | 类型 | 必选 | 说明 |
| ADDRESS | 十六进制数 | 是 | 要读写的物理内存地址 |
| WIDTH | 字符 | 否 |
访问宽度: • b – 字节 (8-bit) |
| VALUE | 十六进制数 | 否 | 要写入的值 |
通过busybox调用devmem命令写外设:

可以看到sudo busybox devmem 0x20010080 w 0x55命令让一半的灯亮起来,一半灯熄灭了。sudo busybox devmem 0x20010080 w 0xff命令让所有灯亮起来了。
通过busybox调用devmem命令读外设:

集成 devmem2 工具
devmem2 安装到目标系统上:
sudo apt-get install devmem2

命令devmem2后面跟着如下三个参数:
| 参数 | 类型 | 必选 | 说明 |
| ADDRESS | 十六进制数 | 是 | 要读写的物理地址 |
| WIDTH | 字符 | 否 |
访问宽度: • b – 字节 (8-bit) |
| VALUE | 十六进制数 | 否 | 要写入的值 |
调用devmem2命令写外设:

调用devmem2命令读外设:

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 (基本不再维护)
浙公网安备 33010602011771号