神奇的/dev/mem

发布于 2022-09-30 20:00:48 字数 2915 浏览 11 评论 0

google了一下,说、dev/mem能映射kernel的内存
我也跟着测试了下:
片外sram:0x7000 0000~0x7800 0000   128M
这片区域能读出数据
但在0x78000000~0x7fffffff之间也能读出数据,这是为什么啊,我这片区域没有内存啊
在0x78000000~0x7fffffff之间也能读出数
而除了0~256M,和(4G-256M)~4G之间能读出数据,其他的位置都是ff。这又是为什么呢?
   1. #include <sys/types.h>
   2. #include <stdio.h>
   3. #include <sys/ioctl.h>
   4. #include <sys/mman.h>
   5. #include <fcntl.h>
   6. #include <stdlib.h>
   7. #include <memory.h>
   8. #define SRAM_BASE 0x70000000
      #define SRAM_END  0x71000000
      #define SRAM_SIZE (SRAM_END-SRAM_BASE)
   9.

  10. int main(int argc,char *argv[])
  11. {
  12.     char* map_base;
  13.     int fd;
  14.     char read_buf[10];
  15.     if((fd=open("/dev/mem",O_RDWR|O_SYNC))==-1)
  16.     {
  17.           perror("open /dev/mem");
  18.         return(-1);
  19.     }
  20.

  21.    map_base=mmap(0,SRAM_SIZE,PROT_READ|PROT_WRITE,MAP_SHARED,fd,SRAM_BASE);
  22.    printf("sram_base:%lx\n",SRAM_BASE);
  23.    printf("sram_size:%lx\n",SRAM_SIZE);
  24.    printf("map_base:%lx\n",map_base);
  25.    if((int)map_base ==-1)
  26.    {
  27.       printf("Error: failed to map framebuffer device %lx to memory. fd=%d\r\n",(unsigned long)map_base,fd);
  28.       perror("mmap:");
  29.       exit(0);
  30.    }
  31.     memcpy(read_buf,(char *)map_base,10);
  32.     printf("read sram :%s \n",read_buf);
  33.     while(1){
  34.

  35.         sleep(1);
  36.     }
  37.     close(fd);
  38.     munmap(map_base,SRAM_SIZE);//解除映射关系
  39.     return 0;
  40.     
  41. }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

千年*琉璃梦 2022-10-07 20:00:48

你可以这样测试,写个内核模块,申请一块内存,然后写入一些数据,将这块内存的物理地址获取到,然后用户空间直接按照 /dev/mem 读取这块地址,看一下数据是否和写入的一致。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文