c - 为什么 mmap 会失败?

标签 c linux-kernel linux-device-driver mmap

我得到了一个物理地址,特别是 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 by sysconf(_SC_PAGE_SIZE).

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

因此,您必须调整偏移量。

关于c - 为什么 mmap 会失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39049154/

相关文章:

c - 重定位被截断以适合 : R_X86_64_PC32 against undefined symbol `cfree'

java - 使用C/C++/Java获取基本硬件信息

c++ - 由于无符号算术运算符的环绕而导致的 MISRA 错误

c - 整数相加问题xCode

linux - 这是 linux 内核中有关写入/proc/self/loginuid 的错误吗?

linux - 谁在映射该页面? —反向图

linux - 当我运行 make menuconfig 或 make config 时它是如何工作的?

linux - 错误:general protection fault fffc

linux - 如何从 inode /路径名中找到一个 dentry?

linux - 定时器中断是否与系统处于内核模式或用户模式无关?