后来我开始
学习了一下《LDD3》的《第十五章 内存映射和DMA》(内容太多,还在努力),也顺便请教了一下同事。一个比较资深的同事说:已经有这样的工具了,就是利用/dev/mem的,叫做devmem2。后来我自己找了一下这个工具的源码。这个工具的源码简单,google一下到处都是,这里随便给出一两个地址:
我自己下载后顺手搞了个Makefile后打包,分享如下:
其实这个工具的原理也比较简单,就是应用程序通过mmap函数实现对/dev/mem驱动中mmap方法的使用,映射了设备的内存到用户空间,实现对这些物理地址的读写操作。使用方法:
-
用法: devmem2 { address } [ type [ data ] ]
-
address : 物理地址
-
如果是要修改该地址的数据,需要填入下面的参数;如果只是读取,省略即可
-
type :要访问的数据类型 : [b]yte, [h]alfword, [w]ord
-
data :想要写入的数据
通过使用,发现IO内存和物理内核都可以读写。
-----------------------------------------------------------------------------------------
在后来的模块调试中,有一次需要查看内核虚拟地址中的数据,我又想起了“/dev/kmem”,直接就在网上找了一个通过这个节点读取(仅支持读取)内核虚拟地址中的数据。经过测试,只适用于内核逻辑地址。
加入Makefile后打包,分享如下:
使用方法:
-
用法: devkmem { address }
-
address : 虚拟地址(内核逻辑地址)
-----------------------------------------------------------------------------------------------
/dev/mem和/dev/kmem其实是在同一个驱动中代码中产生的:drivers/char/mem.c
如果想知道具体的情况,建议大家认真学习《LDD3》的《第十五章 内存映射和DMA》,然后自己分析源码。