2016-08-19 44 views
2

我给了一个物理地址,特别是0x000000368d76c0。我正在尝试将mmap加入我的程序中。我使用的代码是为什么mmap失败?

void *mmap64; 
off_t offset = 0x000000368d76c0; 
int memFd = open("/dev/mem", O_RDWR); 
if (-1 == memFd) 
    perror("Error "); 

mmap64 = mmap(0, sizeof(uint64_t), PROT_WRITE | PROT_READ, MAP_SHARED, memFd, offset); 
if (MAP_FAILED == mmap64) { 
    perror("Error "); 
    return -1; 
} 

出于某种原因,当我运行这段代码我得到mmap失败。具体来说它说Error Invalid argument。我很确定这是因为offset的价值,但我不知道它有什么问题。

我将不胜感激任何帮助。

+0

您是否在'mmap()'的参数中用'adddress'指代'address'? – MikeCAT

+0

@MikeCAT我的意思是'offset'参数。 – flashburn

+7

[mmap(2) - Linux手册页](http://man7.org/linux/man-pages/man2/mmap.2.html)表示“'offset'必须是返回的页面大小的倍数'的sysconf(_SC_PAGE_SIZE)'”。你系统中的价值是什么?参考:[sysconf(3) - Linux手册页](http://man7.org/linux/man-pages/man3/sysconf.3.html) – MikeCAT

回答

3

mmap(2) - Linux manual page

offset必须是页面大小为 通过sysconf(_SC_PAGE_SIZE)返回的倍数。

当页面大小为4096(x86 CPU中使用的页面大小)时,0x000000368d76c0不是4096的倍数,将被视为无效。由于这个原因,你将不得不调整偏移量。