使用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 。 但是,使用不同的offset_chip_addr_值多次调用mmap会基本上覆盖最后一次调用的映射段。 它可以从/proc/<PID>/maps文件中看到。

有没有很好的解决这个问题? 除了mmap之外,还有一大块/dev/mem ,然后在那里访问不同的偏移量。

你应该可以使用lseek移动当前的文件偏移量。 然后,下一个write()将会到那个位置。 或者,将多个不同的文件描述符映射到相同的文件可能会更容易。 例如,看这个问题: 我们可以在同一个/ dev文件上使用两个MMAP 。

发现问题 – 只需要从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; }