后来我开始学习了一下《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后打包,分享如下:
源码下载地址:使用/dev/kmem读取内核变量的值
使用方法:
- 用法: devkmem { address }
- address : 虚拟地址(内核逻辑地址)
-----------------------------------------------------------------------------------------------
/dev/mem和/dev/kmem其实是在同一个驱动中代码中产生的:drivers/char/mem.c
如果想知道具体的情况,建议大家认真学习《LDD3》的《第十五章 内存映射和DMA》,然后自己分析源码。
我对这部分的学习笔记分了好几个部分,尚在更新中:《第十五章 内存映射和DMA》
网上简要的描述:Linux下/dev/mem和/dev/kmem的区别