c++ - 使用 mmap 映射文件中的不同段

标签 c++ linux mmap

我需要mmap /dev/mem地址空间进入我的进程以访问硬件设备。有几个具有不同偏移量的设备。这个过程应该相当简单,有多个在线示例:

  if ((mem_fd_ = open("/dev/mem", O_RDWR)) < 0 ) {
    std::cerr << "error opening '/dev/mem' " << strerror(errno);
    return false;
  }

  // Map the kernel memory space
  mmap_addr_ = (uint8_t *)mmap(nullptr, page_size_,
                                PROT_READ|PROT_WRITE,
                                MAP_SHARED|MAP_FIXED,
                                mem_fd_,
                                offset_chip_addr_);
  if (mmap_addr_ == MAP_FAILED) {
    std::cerr << "error in mmap: " << strerror(errno);
    return false;
  }

但是所有示例都假设只调用一次 mmap在一个过程中。但是,调用 mmap多次使用不同的 offset_chip_addr_ 值基本上会用最后一次调用覆盖映射段。从/proc/<PID>/maps可见文件。

这个问题有好的解决办法吗?除了 mmap正在处理很大一部分 /dev/mem一次然后只是在那里访问不同的偏移量。

最佳答案

发现问题 - 只需要从 mmap 中删除 MAP_FIXED 标志:

if ((mem_fd_ = open("/dev/mem", O_RDWR)) < 0 ) {
    std::cerr << "error opening '/dev/mem' " << strerror(errno);
    return false;
  }

  // Map the kernel memory space
  mmap_addr_ = (uint8_t *)mmap(nullptr, page_size_,
                                PROT_READ|PROT_WRITE,
                                MAP_SHARED,
                                mem_fd_,
                                offset_chip_addr_);
  if (mmap_addr_ == MAP_FAILED) {
    std::cerr << "error in mmap: " << strerror(errno);
    return false;
  }

关于c++ - 使用 mmap 映射文件中的不同段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43265450/

相关文章:

java - Java 中 C++ 的 std::bind 是否等效?

linux-kernel - MAP_HUGETLB 是一致内存的同义词吗? (成功时)

c - C 中使用 mmap 多线程读取文件

linux - malloc() 是在内核空间吗?

c - mmap的对齐和粒度

c++ - 为什么引用的 int 被转换为 void 指针?

c++ - 发送鼠标点击信息

c++ - LNK2001 在 VS 2013 (MSVC 18) 但不是在 VS 2015 (MSVC 19)

android - 使用 AndroidStudio + gradle + NDK 为 Android 和 Linux 构建库

linux - 如何在完成一个 shell 命令后执行其他命令