转载:http://blog.csdn.net/zhanglei4214/article/details/6653568

使用 hexedit /dev/mem 可以显示所有物理内存中的信息。 运用mmap将/dev/mem map出来,然后直接对其读写可以实现用户空间的内核操作。

以下是我写的一个sample

  1. #include<stdio.h>
  2. #include<unistd.h>
  3. #include<sys/mman.h>
  4. #include<sys/types.h>
  5. #include<sys/stat.h>
  6. #include<fcntl.h>
  7. int main()
  8. {
  9. unsigned char * map_base;
  10. FILE *f;
  11. int n, fd;
  12. fd = open("/dev/mem", O_RDWR|O_SYNC);
  13. if (fd == -1)
  14. {
  15. return (-1);
  16. }
  17. map_base = mmap(NULL, 0xff, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0x20000);
  18. if (map_base == 0)
  19. {
  20. printf("NULL pointer!\n");
  21. }
  22. else
  23. {
  24. printf("Successfull!\n");
  25. }
  26. unsigned long addr;
  27. unsigned char content;
  28. int i = 0;
  29. for (;i < 0xff; ++i)
  30. {
  31. addr = (unsigned long)(map_base + i);
  32. content = map_base[i];
  33. printf("address: 0x%lx   content 0x%x\t\t", addr, (unsigned int)content);
  34. map_base[i] = (unsigned char)i;
  35. content = map_base[i];
  36. printf("updated address: 0x%lx   content 0x%x\n", addr, (unsigned int)content);
  37. }
  38. close(fd);
  39. munmap(map_base, 0xff);
  40. return (1);
  41. }

上面的例子将起始地址0x20000(物理地址), 长度为0xff映射出来。 然后就可以像普通数组一样操作内存。

下面是输出结果

address: 0x7f3f95391000   content 0x0           updated address: 0x7f3f95391000   content 0x0
address: 0x7f3f95391001   content 0x0           updated address: 0x7f3f95391001   content 0x1
address: 0x7f3f95391002   content 0x0           updated address: 0x7f3f95391002   content 0x2
address: 0x7f3f95391003   content 0x0           updated address: 0x7f3f95391003   content 0x3
address: 0x7f3f95391004   content 0x0           updated address: 0x7f3f95391004   content 0x4
。。。

我的测试机器是64位机。 该例子将物理地址0x20000映射到了虚拟地址0x7f3f95391000。

首先将当前地址下的内容输出, 然后写入新值。

可以通过 hexedit /dev/mem 验证新值已经写入。

如果想在用户态处理kernel分配的地址可以这么做。 首先用virt_addr = get_free_pages(GFP_KERNEL,
order)分配内存,通过phy_addr = __pa(virt_addr)得到物理地址,然后在用户态将/dev/mem用mmap 映射出来,
offset就是phy_addr, length设为 2^order。 此时就可以在用户态读写内核分配的内存了。

注:该操作需要有root权限。

利用mmap /dev/mem 读写Linux内存的更多相关文章

  1. /dev/mem直接操作硬件寄存器

    /******************************************************************************* * /dev/mem直接操作硬件寄存器 ...

  2. Linux下直接读写物理地址内存

    虚拟 转 物理地址  virt_to_phys( *addr );物理 转 虚拟地址  phys_to_virt( *addr ); 如: unsigned long pProtectVA; phys ...

  3. Linux内存管理 (9)mmap(补充)

    之前写过一篇简单的介绍mmap()/munmap()的文章<Linux内存管理 (9)mmap>,比较单薄,这里详细的梳理一下. 从常用的使用者角度介绍两个函数的使用:然后重点是分析内核的 ...

  4. /dev/mem可没那么简单

    这几天研究了下/dev/mem.发现功能非常奇妙,通过mmap能够将物理地址映射到用户空间的虚拟地址上.在用户空间完毕对设备寄存器的操作,于是上网搜了一些/dev/mem的资料. 网上的说法也非常统一 ...

  5. /dev/mem可没那么简单【转】

    转自:http://blog.csdn.net/skyflying2012/article/details/47611399 这几天研究了下/dev/mem,发现功能很神奇,通过mmap可以将物理地址 ...

  6. Linux内存管理【转】

    转自:http://www.cnblogs.com/wuchanming/p/4360264.html 转载:http://www.kerneltravel.net/journal/v/mem.htm ...

  7. 通过/dev/mem操作物理内存

    /dev/mem设备可以用来访问物理内存.下面一段应用程序的代码,实现了通过/dev/mem对物理内存空间中SRAM1的访问. #include <stdio.h> #include &l ...

  8. linux下共享内存mmap和DMA(直接访问内存)的使用 【转】

    转自:http://blog.chinaunix.net/uid-7374279-id-4413316.html 介绍Linux内存管理和内存映射的奥秘.同时讲述设备驱动程序是如何使用“直接内存访问” ...

  9. Linux内存管理之mmap详解

    转发之:http://blog.chinaunix.net/uid-26669729-id-3077015.html Linux内存管理之mmap详解 一. mmap系统调用 1. mmap系统调用  ...

随机推荐

  1. 【Hadoop代码笔记】Hadoop作业提交之Child启动map任务

    一.概要描述 在上篇博文描述了TaskTracker启动一个独立的java进程来执行Map或Reduce任务.在本篇和下篇博文中我们会关注启动的那个入口是org.apache.hadoop.mapre ...

  2. SRM 508 DIV1 500pt(DP)

    题目简述 给定一个大小为 n的序列(n<=10)R,要求你计算序列A0, A1, ..., AN-1的数量,要求A序列满足A0 + A1 + ... + AN-1 = A0 | A1 | ... ...

  3. 惊艳的随机化方法 -World Search (homework-04)

    homeword04-word search 0. 摘要 本次作业,要求完成一个word search的程序,具体要求是: 输入:一个包含20-60个单词的文件,各单词不大于20个字母,无空格. 输出 ...

  4. 使用Cygwin通过ssh命令行来访问Windows8

    安装Cygwin可以参考<如何在Windows中通过Cygwin来使用Linux命令>. 在Win8下貌似有个bug,需要将cygwin\bin\mintty 修改为cygwin\bin\ ...

  5. POJ 3660 Cow Contest(传递闭包floyed算法)

    Cow Contest Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5989   Accepted: 3234 Descr ...

  6. TMS320F2803x系列实时控制 MCU 技术文档

      C2000系列实时控制器简介: C2000 生产选择指南 sprufk8.pdf 数据表: 中文板:TMS320F28030/28031/28032/28033/28034/28035 Picco ...

  7. java 2 8 10 16

    An integer literal may be expressed in decimal (base 10), hexadecimal (base 16), octal (base 8), or ...

  8. ActiveMQ学习笔记(二) JMS与Spring

    上文可见,JMS Native API使用起来不是特别方便.好在Spring提供了很好的JMS支持. (一)配置ConnectionFactory 如果使用连接池的话,不要忘记activemq-poo ...

  9. [置顶] 很荣幸被选为2013年度 CSDN博客之星评选,如果觉得我的文章可以,请投我一票!

    亲爱的小伙伴们,很荣幸我被选为<2013年度CSDN博客之星候选人>,希望大家多多支持,geekguy会继续努力,为大家奉献更好的文章. 投票地址:http://vote.blog.csd ...

  10. Activator.CreateInstance 方法 (Type) 的用法

    转自:http://www.cnblogs.com/lmfeng/archive/2012/01/30/2331666.html Activator.CreateInstance 方法 (Type) ...