2015年(109)
分类:
2015-01-23 16:18:12
原文地址:奇怪的/dev/mem应用程序访问硬件的问题 作者:myleeming
今天在看君正的代码的时候,发现它写了一个NandFlash的驱动,最让人惊讶的是它完全是通过应用程序来实现的,彻底脱离底层驱动。主要用到的函数就是mmap,munmap。实际就是利用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上实现了,不知道问题出在哪,贴出来待考证,也希望做过的朋友能给些建议。