0

2.6.32 MIPS カーネルでは、メモリ レイアウトが常に同じであることに気付きました。つまり、プログラムには、0x10146000ほとんどのプロセス(または少なくとも私が調べたプロセス)で始まるヒープがあります。また、もう 1 つの類似点は、 が常に から/lib32/ld-2.9.so始まること2aaa8000です。

したがって、基本的にヒープはこのサイズすべての仮想メモリに予約されています。これを変更したいと思います。ある時点で仮想メモリが不足すると (残りのアドレス空間で)、mmap は試行せずに失敗するように思われるからです。ヒープはかろうじて数 MB ですが、上記のスペースにマップします。カーネルがこのアドレスを設定する場所はありますか?

4

1 に答える 1

2

調べてみると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 (プログラムのコード、データ、および初期化されていないデータ セグメントに適合するのに十分です) であることに注意してください。

于 2012-09-21T11:02:09.163 に答える