Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1006681
  • 博文数量: 153
  • 博客积分: 4195
  • 博客等级: 上校
  • 技术积分: 2631
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-22 11:32
文章存档

2012年(7)

2010年(35)

2009年(111)

分类:

2009-11-13 15:36:03

今天在看君正的代码的时候,发现它写了一个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上实现了,不知道问题出在哪,贴出来待考证,也希望做过的朋友能给些建议。

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

chinaunix网友2009-11-14 15:11:15

不知不觉已是第100篇了,纪念一下

chinaunix网友2009-11-13 18:22:37

刚在mini2440上做了下对比测试,发现用这种应用程序的格式是能访问底层硬件的,看来还是我们的处理器的原因,或者是我们的sdk的原因,待查