返されたアドレス 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_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 に減らす場合、問題はありません。