LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 3050|回复: 8

新手求助: dev/mem中的信息是内存信息么?

[复制链接]
发表于 2006-11-15 14:37:26 | 显示全部楼层 |阅读模式
各位朋友好!我是一个新手, 我想读取物理内存中的信息
我通过设备文件/dev/mem和内存影射mmap来读取, 但读出来的信息是物理内存里的信息么?
我用了个小程序,把一些字符写入到内存中,然后再读取dev/mem设备文件里的信息,结果在我读出的信息中没有找到我写进去的字符.
所以我想问下大家,从dev/mem设备文件读出的信息是内存信息么?

我的系统是 fedora

先谢谢大家了!
发表于 2006-11-15 16:21:18 | 显示全部楼层
写入和读出的地址保证相同?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-11-15 16:46:21 | 显示全部楼层

谢谢这位朋友的回复!

Post by x11
写入和读出的地址保证相同?



我把/dev/mem中的信息,全部读出来,系统物理内存多大,就读出了多少,保存成2进制文件.而且2进制文件的大小和物理内存的大小一致!
不会是我写内存的那个程序出了问题, 分配静态内存空间,然后写进去的字符
回复 支持 反对

使用道具 举报

发表于 2006-11-15 16:57:56 | 显示全部楼层
建议贴出代码
回复 支持 反对

使用道具 举报

发表于 2006-11-15 17:44:05 | 显示全部楼层
Documentation/devices.txt:                1 = /dev/mem          Physical memory access
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-11-15 18:18:41 | 显示全部楼层
代码是这样的:


  fd=open(_PATH_MEM,O_RDWR);
  if(fd<0)
    {
      printf("open the /dev/mem failed!\n");
      return 1;
    }

  ......  

  /* map the dev/mem */
  offset = start*1024;               //start 是四的倍数  
  mem = mmap(0,dump_size,PROT_READ,MAP_SHARED,fd,offset);
  buffer=mem;
  if (mem == NULL)
    {
      printf("mem is null \n");
      return 1;
    }

  if( (fp = fopen(sFile,"wb+")) != NULL )
    {
      for(count=0; count < read_pagect; count++)
        {       
          
          if(fwrite(buffer,1,page_size,fp) != page_size)
            {
              printf("write file error in.\n");
              return 1;
            }
         
          buffer += page_size;
        }
      fclose(fp);
    }
  munmap(mem,dump_size);

这是那部分代码 其他代码写的比较烂,不太好意思贴出来, 主要的都写出来了  我是一页一页读取的
新手,代码写的烂,大家别笑话!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-11-15 18:21:48 | 显示全部楼层
不好意思, 忘了缩进了!  写的时候有缩进的,发出来就成这样了,大家不好看,我回去再给大家贴一次
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-11-17 11:01:44 | 显示全部楼层
我想问一下大家,这个问题会不会和进程权限有一定的关系呢?

我在内核是2,4的系统上,用dd命令 可以把设备文件/dev/mem映射出来,而且从映射出来的信息中可以找到系统进程表的信息和我测试自己写到物理内存的信息.
我在内核是2.6的系统上用dd命令,运行一下就有"拒绝访问"的信息提示.

大家以前遇到过这种情况没有呢? 谢谢大家!
回复 支持 反对

使用道具 举报

发表于 2008-7-14 22:54:00 | 显示全部楼层
在2.4,可以直接打开/dev/mem,然后读取。

在2.6,直接打开/dev/mem后,只可以读取前0x101000部分的内容(ubuntu)。大约是1MB加4KB。读取后面的内容将出现"open not permitted"错误。

解决的方法是使用mmap()。routine如下:

f = open("/dev/mem", O_RDONLY);

my_mem = mmap (0, 0x1000, PROT_READ, MAP_SHARED, f, 0x34f000);
if (my_mem == MAP_FAILED)
printf("map failed %s\n",strerror(errno));
通过my_mem就可以得到0x101000之后的内存内容了。

http://my.opera.com/yangguangxiang/blog/2008/02/17/dev-mem
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表