Chinaunix首页 | 论坛 | 博客
  • 博客访问: 33018
  • 博文数量: 21
  • 博客积分: 338
  • 博客等级: 一等列兵
  • 技术积分: 165
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-31 09:41
文章分类

全部博文(21)

文章存档

2011年(21)

我的朋友

分类: LINUX

2011-03-19 14:38:25

对/dev/mem比较好奇,先说一下我的学习板片内sram:0x0030 0000~0x0031 0000   64KB
          片外sram:0x7000 0000~0x7800 0000   128M
我先后选了4个地址:
         1>  0x7000 0000~0x7100 0000
         2>  0x7800 0000~0x7900 0000
         3>  0x0030 0000~0x0040 0000
         4>  0xff00 0000~0x1 0000 0000
4个地址,前3个都能写能读,第4个不能写也不能读
————————————————————————————
现在我有问题为什么前3个地址都能写能读啊?
写代码和读代码
  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. int main(int argc,char *argv[])
  10. {
  11.     char* map_base;
  12.     int fd;
  13.     if((fd=open("/dev/mem",O_RDWR|O_SYNC))==-1)
  14.     {
  15.           perror("open /dev/mem");
  16.         return(-1);
  17.     }

  18.    map_base=mmap(0,SRAM_SIZE,PROT_READ|PROT_WRITE,MAP_SHARED,fd,SRAM_BASE);
  19.    printf("sram_base:%lx\n",SRAM_BASE);
  20.    printf("sram_size:%lx\n",SRAM_SIZE);
  21.    if((int)map_base ==-1)
  22.    {
  23.       printf("Error: failed to map framebuffer device %lx to memory. fd=%d\r\n",(unsigned long)map_base,fd);
  24.       perror("mmap:");
  25.       exit(0);
  26.    }
  27.    printf("map_base:%lx\n",map_base);
  28.     strcpy((char *)map_base,"hello abcd");
  29.     while(1){

  30.         sleep(1);
  31.     }

  32.     close(fd);
  33.     munmap(map_base,SRAM_SIZE);//解除映射关系
  34.     return 0;
  35.     
  36. }
  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. int main(int argc,char *argv[])
  10. {
  11.     char* map_base;
  12.     int fd;
  13.     char read_buf[10];
  14.     if((fd=open("/dev/mem",O_RDWR|O_SYNC))==-1)
  15.     {
  16.           perror("open /dev/mem");
  17.         return(-1);
  18.     }

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

  32.         sleep(1);
  33.     }
  34.     close(fd);
  35.     munmap(map_base,SRAM_SIZE);//解除映射关系
  36.     return 0;
  37.     
  38. }
我后来想了下,这样乱写有可能会覆盖内核的镜像,于是我看SAM—BA下拷贝程序的位置:
Read device Chip ID at 0xffffee40 --- get 0x819b05a2
Chip ID at 0xffffee40,在那我读到了0x819b05a2
在0x40200000的位置(nand的物理位置,里面的数据时kernel镜像),可是我读出来的都是FFFFFFFFF
————————————————————————————————————————
现在有几个问题:
我的片外SRAM只有128M也就是0x70000000~0x78000000
在这之间能读出数据,在0x78000000~0x7fffffff之间也能读出数据,而除了0~256M,和(4G-256M)~4G之间能读出数据,其他的位置都是ff。这是为什么呢?
看来只有看mem驱动了

阅读(2899) | 评论(0) | 转发(0) |
0

上一篇:杂记2

下一篇:内核学习

给主人留下些什么吧!~~