Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3139351
  • 博文数量: 241
  • 博客积分: 15936
  • 博客等级: 上将
  • 技术积分: 25228
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-27 11:22
个人简介

Fedora-ARM

文章分类
文章存档

2016年(3)

2014年(1)

2013年(3)

2012年(50)

2011年(61)

2010年(26)

2009年(27)

2008年(21)

2007年(49)

分类: LINUX

2011-11-04 16:48:59

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


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

tekkamanninja2011-11-29 09:36:19

todaygood: 用法: devkmem { address }  , 这个address 应该是虚拟地址才对。

你的工具在x86-64 上测试,不成功,mmap返回invalid argument.

在32bit kernel 上测试,是o.....
我的邮箱是:tekkamanninja@gmail.com
通常是gtalk在线

tekkamanninja2011-11-29 09:33:56

todaygood: 那个是笔误,我知道
这个问题是另外一个问题:
工具在x86-64 上测试,不成功,mmap返回invalid argument, mmap换成mmap64之后不能读取内容。.....
感觉这个是和构架相关的,因为涉及到内核逻辑地址,如果devkmem后面的参数超出了内核逻辑地址的范围,就会出这个问题这个错误。在ARM上也有这样的问题。
对于x86-64的逻辑地址范围是什么我不知道~~~~~构架不熟

todaygood2011-11-29 08:04:57

tekkamanninja: 我写错了,手误,cp过来没有改,不好意思.....
那个是笔误,我知道
这个问题是另外一个问题:
工具在x86-64 上测试,不成功,mmap返回invalid argument, mmap换成mmap64之后不能读取内容。

tekkamanninja2011-11-28 17:37:31

todaygood: 用法: devkmem { address }  , 这个address 应该是虚拟地址才对。

你的工具在x86-64 上测试,不成功,mmap返回invalid argument.

在32bit kernel 上测试,是o.....
我写错了,手误,cp过来没有改,不好意思

todaygood2011-11-28 17:04:25

用法: devkmem { address }  , 这个address 应该是虚拟地址才对。

你的工具在x86-64 上测试,不成功,mmap返回invalid argument.

在32bit kernel 上测试,是ok的。

my email: today.good@163.com
let's make friends!