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

时间:2017-04-06 20:46:51

标签: c++ linux mmap

我需要volatile 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一次,然后只是访问不同的偏移量。

2 个答案:

答案 0 :(得分:1)

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

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;
  }

答案 1 :(得分:0)

您应该可以使用lseek来移动当前文件偏移量。然后,下一个write()将到达该位置。或者,将多个不同的文件描述符映射到同一文件可能更容易。例如,请参阅此问题:Can we TWO MMAP on same /dev file