Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1370576
  • 博文数量: 244
  • 博客积分: 10311
  • 博客等级: 上将
  • 技术积分: 3341
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-14 21:50
文章分类

全部博文(244)

文章存档

2013年(6)

2012年(5)

2011年(16)

2010年(11)

2009年(172)

2008年(34)

分类:

2011-11-13 17:28:31

    前段时间一个学习Linux的朋友问我:“可不可以在调试设备驱动的时候,利用一个小工具来查看CPU中寄存器的值?”我当时对他说:“一般都是Printk打印出来的。”后来这个朋友自己去找了资料告诉我:好像用/dev/mem可以实现。后来我自己找了以下相关的资料,发现正好是我当年没有继续学习的《LDD3》的《第十五章 内存映射和DMA》是知识,惭愧惭愧阿~~~~~
    后来我开始学习了一下《LDD3》的《第十五章 内存映射和DMA》(内容太多,还在努力),也顺便请教了一下同事。一个比较资深的同事说:已经有这样的工具了,就是利用/dev/mem的,叫做devmem2。后来我自己找了一下这个工具的源码。这个工具的源码简单,google一下到处都是,这里随便给出一两个地址:
我自己下载后顺手搞了个Makefile后打包,分享如下:

   其实这个工具的原理也比较简单,就是应用程序通过mmap函数实现对/dev/mem驱动中mmap方法的使用,映射了设备的内存到用户空间,实现对这些物理地址的读写操作。使用方法:
  1. 用法: devmem2 { address } [ type [ data ] ]
  2. address : 物理地址
  3. 如果是要修改该地址的数据,需要填入下面的参数;如果只是读取,省略即可
  4. type :要访问的数据类型 : [b]yte, [h]alfword, [w]ord
  5. data :想要写入的数据
通过使用,发现IO内存和物理内核都可以读写。
-----------------------------------------------------------------------------------------
  在后来的模块调试中,有一次需要查看内核虚拟地址中的数据,我又想起了“/dev/kmem”,直接就在网上找了一个通过这个节点读取(仅支持读取)内核虚拟地址中的数据。经过测试,只适用于内核逻辑地址。
加入Makefile后打包,分享如下:

使用方法:
  1. 用法: devkmem { address }
  2. address : 虚拟地址(内核逻辑地址)
-----------------------------------------------------------------------------------------------
/dev/mem和/dev/kmem其实是在同一个驱动中代码中产生的:drivers/char/mem.c
如果想知道具体的情况,建议大家认真学习《LDD3》的《第十五章 内存映射和DMA》,然后自己分析源码。
我对这部分的学习笔记分了好几个部分,尚在更新中:《第十五章 内存映射和DMA》


阅读(1067) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~