访问 mmap 地址时,收到信号 SIGBUS
When accessing mmap adress, signal SIGBUS was received
当我尝试访问 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)
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)
= 0 '[=12=]0'
从下面的地图信息可以看出,我上面访问的地址都在mmap地址范围内:
0x401000000000 0x401010000000 0x10000000 0x0 /dev/mem.alloc
但是,在写入这些不可访问的地址时,出现总线错误:
程序接收信号 SIGBUS,总线错误。
PS.When 减少 shared_size 从 256M 到 128M,没有问题。
我已经修好了。这是一个很容易被忽视的问题。 space dev 挂载太小了……所以……你知道的……
当我尝试访问 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)
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)
= 0 '[=12=]0'
从下面的地图信息可以看出,我上面访问的地址都在mmap地址范围内:
0x401000000000 0x401010000000 0x10000000 0x0 /dev/mem.alloc
但是,在写入这些不可访问的地址时,出现总线错误: 程序接收信号 SIGBUS,总线错误。
PS.When 减少 shared_size 从 256M 到 128M,没有问题。
我已经修好了。这是一个很容易被忽视的问题。 space dev 挂载太小了……所以……你知道的……