为什么mmap会失败?

4

我有一个物理地址,具体为0x000000368d76c0。我想将其映射到我的程序中。我正在使用的代码是:

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值的问题,但我不知道哪里出了问题。
我会感激任何关于此问题的帮助。

你在 mmap() 的参数中所说的 adddress 是指 address 吗? - MikeCAT
@MikeCAT 我的意思是 offset 参数。 - flashburn
7
根据Linux手册页面mmap(2) - Linux manual page所述,"offset必须是通过sysconf(_SC_PAGE_SIZE)返回的页面大小的倍数"。在您的系统中,该值是多少?参考:sysconf(3) - Linux manual page - MikeCAT
1
@MikeCAT - 为什么不把那个发表成答案呢? - Support Ukraine
因为我还没有获取到该值。 - MikeCAT
显示剩余2条评论
1个回答

5
根据mmap(2) - Linux手册页面

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


当页面大小为4096(x86 CPU使用的页面大小)时,0x000000368d76c0不是4096的倍数,将被视为无效。

因此,您需要调整偏移量。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接