我得到了一个物理地址,特别是 0x000000368d76c0
。我正在尝试将它 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
值,但我不知道它有什么问题。
如有任何帮助,我将不胜感激。
最佳答案
根据 mmap(2) - Linux manual page ,
offset
must be a multiple of the page size as returned bysysconf(_SC_PAGE_SIZE)
.
当页面大小为 4096(x86 CPU 中使用的页面大小)时,0x000000368d76c0
不是 4096 的倍数,将被视为无效。
因此,您必须调整偏移量。
关于c - 为什么 mmap 会失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39049154/