我需要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/