对/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个地址都能写能读啊?
写代码和读代码
- #include <sys/types.h>
-
#include <stdio.h>
-
#include <sys/ioctl.h>
-
#include <sys/mman.h>
-
#include <fcntl.h>
-
#include <stdlib.h>
-
#include <memory.h>
-
#define SRAM_BASE 0x70000000
#define SRAM_END 0x71000000
#define SRAM_SIZE (SRAM_END-SRAM_BASE)
-
int main(int argc,char *argv[])
-
{
-
char* map_base;
-
int fd;
-
if((fd=open("/dev/mem",O_RDWR|O_SYNC))==-1)
-
{
-
perror("open /dev/mem");
-
return(-1);
-
}
-
-
map_base=mmap(0,SRAM_SIZE,PROT_READ|PROT_WRITE,MAP_SHARED,fd,SRAM_BASE);
-
printf("sram_base:%lx\n",SRAM_BASE);
-
printf("sram_size:%lx\n",SRAM_SIZE);
-
if((int)map_base ==-1)
-
{
-
printf("Error: failed to map framebuffer device %lx to memory. fd=%d\r\n",(unsigned long)map_base,fd);
-
perror("mmap:");
-
exit(0);
-
}
-
printf("map_base:%lx\n",map_base);
-
strcpy((char *)map_base,"hello abcd");
-
while(1){
-
-
sleep(1);
-
}
-
-
close(fd);
-
munmap(map_base,SRAM_SIZE);//解除映射关系
-
return 0;
-
-
}
- #include <sys/types.h>
-
#include <stdio.h>
-
#include <sys/ioctl.h>
-
#include <sys/mman.h>
-
#include <fcntl.h>
-
#include <stdlib.h>
-
#include <memory.h>
-
#define SRAM_BASE 0x70000000
#define SRAM_END 0x71000000
#define SRAM_SIZE (SRAM_END-SRAM_BASE)
-
-
int main(int argc,char *argv[])
-
{
-
char* map_base;
-
int fd;
-
char read_buf[10];
-
if((fd=open("/dev/mem",O_RDWR|O_SYNC))==-1)
-
{
-
perror("open /dev/mem");
-
return(-1);
-
}
-
-
map_base=mmap(0,SRAM_SIZE,PROT_READ|PROT_WRITE,MAP_SHARED,fd,SRAM_BASE);
-
printf("sram_base:%lx\n",SRAM_BASE);
-
printf("sram_size:%lx\n",SRAM_SIZE);
-
printf("map_base:%lx\n",map_base);
-
if((int)map_base ==-1)
-
{
-
printf("Error: failed to map framebuffer device %lx to memory. fd=%d\r\n",(unsigned long)map_base,fd);
-
perror("mmap:");
-
exit(0);
-
}
-
memcpy(read_buf,(char *)map_base,10);
-
printf("read sram :%s \n",read_buf);
-
while(1){
-
-
sleep(1);
-
}
-
close(fd);
-
munmap(map_base,SRAM_SIZE);//解除映射关系
-
return 0;
-
-
}
我后来想了下,这样乱写有可能会覆盖内核的镜像,于是我看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驱动了
阅读(2905) | 评论(0) | 转发(0) |