調べてみるとarch/mips/mm/mmap.c
、Linux にメモリを配置する方法が 2 つあります。どちらを選択するかは、 の戻り値にmmap_is_legacy
依存します。これは、無制限のスタックを有効にしているかどうか (レガシー モードを強制する) と、コンパイル済みのバイナリPT_GNU_STACK
(このフラグを設定しないと、互換モードが強制されます)。新しいレイアウトは 2.6.7 で追加され、http://lwn.net/Articles/90311/で説明されています。
簡単に言うと、古いレイアウトは次のようになります。
| CODE ---- | HEAP ----------> | MMAP ------> | <-------- STACK |
| 0GB | | 2GB/3 | 2GB |
新しいレイアウトは次のようになります。
| CODE ---- | HEAP ----------> | <------------- MMAP | --- STACK |
| 0GB | | 2GB-8MB | 2GB |
古いレイアウトでは、ヒープと mmap 領域の間に固定された分割があるのに対し、新しい領域では柔軟であることに注意してください。新しいモードのない古いカーネルを実行しているか、前述の互換モードで実行している可能性があります。
見つかったアドレスは 0x2AAA8000 が約 2GB/3 (libc が最初にマップされるもの) であり、0x10146000 が約 256MB (プログラムのコード、データ、および初期化されていないデータ セグメントに適合するのに十分です) であることに注意してください。