1

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

4

1 に答える 1