Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1071207
  • 博文数量: 277
  • 博客积分: 8313
  • 博客等级: 中将
  • 技术积分: 2976
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-22 11:25
文章分类

全部博文(277)

文章存档

2013年(17)

2012年(66)

2011年(104)

2010年(90)

我的朋友

分类: LINUX

2012-02-16 12:45:12

  1.   前段时间一个学习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》

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