【问题标题】:When accessing mmap adress, signal SIGBUS was received访问mmap地址时,收到信号SIGBUS
【发布时间】:2020-06-16 19:36:21
【问题描述】:

当我尝试访问mmap返回的地址时,发生了总线错误。

我的代码如下:

ftruncate(fd, shared_size);
addr = mmap(shared_start, shared_size, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_FIXED, fd, 0);

shared_size == 256*1024*1024

shared_start == 401000000000(我使用了标志 MAP_FIXED)

将文件截断为 256M。

-rw-r--r--    1 root     0         256.0M Mar  4 03:47 mem.alloc

调用mmap没有问题,并不是所有的地址范围都不允许访问。 从下面的gdb信息可以看出,地址0x40100f11ff00是不允许的,但是地址0x40100fe00000是允许的:

(gdb) p *((char *)addr+0xf11ff00)
Cannot access memory at address 0x40100f11ff00
(gdb) p *((char *)addr+0xfe1ff00)
Cannot access memory at address 0x40100fe1ff00
(gdb) p *((char *)addr+0xfe00000)
$17 = 0 '\000'

从下面的maps信息可以看出我上面访问的地址都在mmap地址范围内:

 0x401000000000     0x401010000000 0x10000000        0x0 /dev/mem.alloc

但是,当写入这些不可访问的地址时,会发生总线错误: 程序收到信号SIGBUS,总线错误。

PS.当将 shared_size 从 256M 减少到 128M 时,没有问题。

【问题讨论】:

  • 您可能已经尝试过这些:(1) SIGBUS 表明该文件有些古怪……尽管我不知道那可能是什么。我会尝试创建一个新的mem.alloc1,确保它正好是 256MiB 字节(例如:dd count=256K bs=1K if=/dev/zero of=/dev/mem.alloc1),并尝试不使用ftruncate()。 (2) 如果这没有帮助,我会尝试不使用MAP_FIXED——以防万一。
  • 你为什么需要 MAP_FIXED? 0x40100f11ff00 没有页面对齐。
  • 0x401010000000是页面对齐的,这是我的内存边界,谢谢~~我已经解决了,因为dev mount的空间太小了......

标签: c 64-bit mmap sigbus


【解决方案1】:

我已经解决了。这是一个很容易被忽视的问题。开发者的空间坐骑太小了……所以……你知道……

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-22
    • 1970-01-01
    • 2017-09-19
    • 2018-04-12
    • 1970-01-01
    • 2014-07-09
    • 1970-01-01
    • 2018-05-21
    相关资源
    最近更新 更多