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

C 访问mmap地址时,收到信号SIGBUS,c,64-bit,mmap,sigbus,C,64 Bit,Mmap,Sigbus,当我试图访问mmap返回的地址时,发生了总线错误 我的代码如下: ftruncate(fd, shared_size); addr = mmap(shared_start, shared_size, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_FIXED, fd, 0); 共享大小==256*1024*1024 shared\u start==40100000000(我使用了标志映射\u FIXED) ftruncate文件到256M -rw-r--r--

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

我的代码如下:

ftruncate(fd, shared_size);
addr = mmap(shared_start, shared_size, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_FIXED, fd, 0);
共享大小==256*1024*1024

shared\u start==40100000000(我使用了标志映射\u FIXED)

ftruncate文件到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.当共享_大小从256M减少到128M时,没有问题。

我已经修复了它。这是一个容易被忽视的问题。dev的空间挂载太小…因此…您知道…

您可能已经尝试过这些方法:(1)SIGBUS建议该文件有点古怪。。。虽然我不知道那会是什么。我会尝试创建一个新的
mem.alloc1
,确保它正好是256mb字节(例如:
dd count=256kbs=1K if=/dev/zero of=/dev/mem.alloc1
),并尝试不使用
ftruncate()。(2) 如果这没有帮助,我会尝试不使用
MAP\u FIXED
——以防万一。为什么需要
MAP\u FIXED
?0x40100f11ff00不是页面对齐的。0x4010100000000是页面对齐的,这是我的内存库,谢谢~~我已经计算出来了,因为用于安装dev的空间太小了。。。。