gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 12:25:21 27 4
gpt4 key购买 nike

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com