同じプログラムが異なる Linux ボックス (すべて 2.6 カーネル) で異なる動作をする 1 つの問題をデバッグしています。基本的に、一部の Linux ボックスでは、16MB の mmap() は常に成功しますが、他の Linux ボックスでは、同じ mmap() が「ENOMEM」で失敗します。
/proc//maps を確認したところ、Linux ボックスごとに仮想メモリ マップが大きく異なっていることがわかりました。1 つのこと: ヒープのアドレス範囲:
linux box1: the mmap() would return address of 31162000-31164000
linux box2: the mmap() would return address of a9a67000-a9a69000
私の質問は次のとおりです。特定のプロセスについて、Linux 仮想メモリはどのように配置されますか? 実際のアドレス範囲を決定するものは何ですか? 未使用の大きな仮想アドレス範囲がいくつかあるにもかかわらず、mmap() が失敗するのはなぜですか?
更新: 16MB の mmap() が失敗するアドレス空間の例を次に示します。
10024000-10f6b000 rwxp 10024000 00:00 0 [heap]
30000000-3000c000 rw-p 30000000 00:00 0
3000c000-3000d000 r--s 00000000 00:0c 5461 /dev/shm/mymap1
3000d000-3000e000 rw-s 00001000 00:0c 5461 /dev/shm/mymap2
3000e000-30014000 r--s 00000000 00:0c 5463 /dev/shm/mymap3
30014000-300e0000 r--s 00000000 00:0c 5465 /dev/shm/mymap4
300e0000-310e0000 r--s 00000000 00:0b 2554 /dev/mymap5
310e0000-31162000 rw-p 310e0000 00:00 0
31162000-31164000 rw-s 00000000 00:0c 3554306 /dev/shm/mymap6
31164000-312e4000 rw-s 00000000 00:0c 3554307 /dev/shm/mymap7
312e4000-32019000 rw-s 00000000 00:0c 3554309 /dev/shm/mymap8
7f837000-7f84c000 rw-p 7ffeb000 00:00 0 [stack]
上記の例では、最後の mymap8 と [stack] の間にまだ大きなスペースがあります。しかし、さらに 16MB の mmap() は失敗します。私の質問は次のとおりです: Linux は mmap() ベースと許容範囲をどのように決定しますか?
ありがとう。