如何验证设备树中预留内存是否生效及/sys/class查询方法
当然可以通过内核提供的sysfs和procfs接口来验证你在设备树中定义的内存是否已被正确预留,确保不会被其他程序意外写入。结合你给出的设备树条目,具体步骤如下:
1. 确认设备树预留节点被内核正确识别
内核会把设备树中的reserved-memory节点解析并暴露在sysfs中,你可以通过以下路径检查:
cd /sys/firmware/devicetree/base/reserved-memory/spw_dma@3E000000/
查看reg文件的内容(设备树中定义的地址和大小),用hexdump解析更直观:
hexdump -C reg
输出应该对应你设备树里的reg = <0x3E000000 0x2000000>——如果是32位架构,会显示两个4字节的大端值:3e 00 00 00(对应0x3E000000)和02 00 00 00(对应0x2000000),这说明内核已经正确读取了你的预留配置。
2. 验证内存区域已被标记为预留
内核会把预留内存从系统可用池移除,你可以通过/proc/iomem查看内存区域的状态:
grep "3e000000" /proc/iomem
如果预留生效,输出会显示类似:
3e000000-3fffffff : Reserved
这个标记意味着这块内存不会被内核的伙伴分配器管理,也无法被普通用户态进程通过malloc等方式分配到,自然也就不会被其他程序意外写入。
3. 额外验证:普通进程无法访问该区域
如果你想进一步确认,可以尝试用普通用户权限编写一个简单的测试程序,尝试mmap这块内存区域——正常情况下会返回失败(权限不足或内存不可用)。即使用root用户尝试,若内核开启了CONFIG_STRICT_DEVMEM配置,写入/dev/mem的预留区域也会被内核阻止(除非你修改了devmem_is_allowed相关逻辑或内核参数)。
需要说明的是,/sys/class下没有直接对应预留内存的专属接口,但上述的sysfs(设备树节点)和procfs(/proc/iomem)都是内核提供的标准、可靠的验证途径,完全可以满足你的需求。
内容的提问来源于stack exchange,提问作者Moritz

