Chinaunix首页 | 论坛 | 博客
  • 博客访问: 165621
  • 博文数量: 109
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 147
  • 用 户 组: 普通用户
  • 注册时间: 2015-01-23 16:12
文章分类

全部博文(109)

文章存档

2015年(109)

我的朋友

分类:

2015-01-23 16:18:12

今天在看君正的代码的时候,发现它写了一个NandFlash的驱动,最让人惊讶的是它完全是通过应用程序来实现的,彻底脱离底层驱动。主要用到的函数就是mmapmunmap。实际就是利用linux dev目录下的mem文件对物理内存进行映射的特性,通过应用程序访问内核态的东西。

 

网络上关于/dev/mem的解释:

dev/mem: 物理内存的全镜像。可以用来访问物理内存。

用来访问物理IO设备,比如X用来访问显卡的物理内存,或嵌入式中访问GPIO。用法一般就是open,然后mmap,接着可以使用map之后的地址来访问物理内存。这其实就是实现用户空间驱动的一种方法。

 

于是我也写了一个很简单的程序,想通过应用程序来获得我们cpu寄存器的一些信息,但是怎么试都是不成功,想不通,是否有高人可以指教。程序代码如下:

#include

#include

#include

#include

#include

 

 

#define M_BASE 0Xc0000000 //看到网上这里有人填物理地址,也有人填对应过后的虚拟地址,但无论哪个都没有读成功。

 

#define M_SIZE 0x1000

 

int main()

{

       int fd;

       int *start;

       fd = open("/dev/mem",O_RDWR|O_SYNC);

       if(fd == -1)

       {

              printf("Can not open memory file!\n");

              return 0;

       }

       start = (int*)mmap(NULL, M_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED,fd, M_BASE );

       if(start == NULL)

       {

              printf("base mmap error\n");

              close(fd);             

              return 0;

       }

       printf("the value is %x\n",*start);

       munmap(start,0x1000);

       close(fd);

       return 0;

      

}

也怀疑是否linux内核选项支持的问题,但是仔细看了一下没有涉及到这部分的内核选项,而且mem所对应的驱动/drivers/char/mem.c是任何情况下都选上的,不需要选项支持,因此应该是linux内核的基本特性,不需要内核选项,那这就奇怪了,网上很多人都在2410或者9200上实现了,不知道问题出在哪,贴出来待考证,也希望做过的朋友能给些建议。

阅读(1190) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~