当我试图访问返回的地址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是不允许的,但地址0x40100 fe00000是允许的:
(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 ' 00'
从下面的地图信息中,我们可以看到我上面访问的地址都在mmap地址的范围内:
0x401000000000 0x401010000000 0x10000000 0x0 /dev/mem.alloc
但是,在写入这些不可访问的地址时,会发生总线错误:程序接收到信号SIGBUS,总线错误。
PS。当shared_size从256M减少到128M时,没有问题
我已经修复了它。这是一个很容易被忽视的问题。dev的空间装载太小。。。所以…你知道。。。。