访问mmap地址时,收到信号SIGBUS

问题描述 投票:1回答:1

当我尝试访问返回的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'

从下面的地图信息中,我们可以看到我上面访问的地址都在mmap地址范围内:

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

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

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

c 64-bit mmap sigbus
1个回答
0
投票

我已经解决了。这是一个很容易忽略的问题。开发人员的空间安装太小...所以....您知道....

© www.soinside.com 2019 - 2024. All rights reserved.