问题:我的mmap为什么不成功
我mmap为什么不成功呢,我的开发板是IXP425,从datasheet查到寄存器地址是0xC4000008,我想读出它的内容,但是mmap都不成功,望前辈指点:
#include <stdio.h>
#include <fcntl.h>
#include <sys/mman.h>
#define EXP_TIMING_CS2 0xC4000008
FILE *f;
void *map_addr;
int fd;
int main(int argc,char** argv)
{
fd=open("/dev/mem",O_RDWR|O_SYNC);
if(fd==-1)
{
printf("Can not open the dev/mem");
return -1;
}
map_addr=mmap(0,0xff,PROT_READ|PROT_WRITE,MAP_SHARED,fd,EXP_TIMING_CS2);
if(map_addr==MAP_FAILED)
printf("map failed\n");
else
printf("map success\n");
return 0;
}
运行结果是: “map failed”
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
查看一下errno 啊
哦,我看了一下errno是 invalid argument。还有,我把映射的偏移地址设置为0,就能映射成功;其它的值我试了几个像是0x01,0xffff都不行。
请问这是什么原因啊?
[ 本帖最后由 bjgs2004 于 2009-4-1 14:19 编辑 ]
0xC4000008 是什么东东,物理内存地址?
恩,它是总线控制器的一个寄存器的地址。
现在发现一个问题:就是如果把fd的偏移地址设置成对应控制器中寄存器的基地址(例如0xC4000000),就能映射成功。谁能解释一下?
驱动要支持吧?毕竟一个是内核区域,一个是用户区域,驱动要做个影射
所有的用户态的mmap最后system call到kernel态的相应函数。
举x86为例,调到的函数是old_mmap,来看该函数的定义:
asmlinkage int old_mmap(struct mmap_arg_struct __user *arg)
{
struct mmap_arg_struct a;
int err = -EFAULT;
if (copy_from_user(&a, arg, sizeof(a)))
goto out;
err = -EINVAL;
if (a.offset & ~PAGE_MASK)
goto out;
err = sys_mmap2(a.addr, a.len, a.prot, a.flags,
a.fd, a.offset >> PAGE_SHIFT);
out:
return err;
}
中的if (a.offset & ~PAGE_MASK)
goto out;
就是你这个错误的罪魁祸首。
谢谢fantry_t,这下我就明白了,原来偏移地址要以页对齐。