神奇的/dev/mem
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
你可以这样测试,写个内核模块,申请一块内存,然后写入一些数据,将这块内存的物理地址获取到,然后用户空间直接按照 /dev/mem 读取这块地址,看一下数据是否和写入的一致。