mmap 内存区域的总线错误

Bus error with mmap memory region

在下面的简单程序中:

# include <sys/mman.h>
# include <fcntl.h>
# include <cstdlib>

# include <cassert>

struct rgn_desc
{
  size_t end_;
  char data[];
};

int main(int argc, const char *argv[])
{
  int fd = open("foo.mm", O_RDWR|O_CREAT|O_TRUNC, (mode_t)0700);

  assert(fd != -1);

  void * ptr = mmap(NULL, 4096, PROT_READ | PROT_WRITE,
                    MAP_SHARED | MAP_POPULATE, fd, 0);

  assert(ptr != (void*) -1);

  rgn_desc * rgn_ptr = (rgn_desc*) ptr;
  rgn_ptr->end_ = 0; // <-- bus error
}

基本上,我想管理一个简单的 mmaped arena 分配器并将我分配的字节存储为映射的第一部分。因此,当我从文件中恢复时,我会得到分配了多少字节。

然而,最后一行给了我一个bus error。有人可以解释为什么,如果可能的话,向我建议一种避免它的方法。我 运行 Linux 在 32 位奔腾上使用 clang++ 编译器

根据文档,如果满足以下条件,信号总线可以触发:

SIGBUS
    Attempted access to a portion of the buffer that does not
    correspond to the file (for example, beyond the end of the
    file, including the case where another process has truncated
    the file).

在你的截图中你的文件大小与你的不匹配mmap() size (0, 4096), so you could use ftruncate()增加你的文件的大小。

ftruncate(fd, 4096);