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