4

私はexeスタックがどこにあるかについて少し混乱しています..プログラムが実行される前にCRTがヒープの量を割り当てることによってヒープを初期化することを知っています(ページを割り当てるOSによって割り当てられます)が、どこにあるスタック?ページにもありますか?それとも、GDT で ring3 記述子を使用して、ユーザー モード (ring3) のすべてのプログラムで共有されますか (そうではないと思いますが、よくわかりません)。

4

3 に答える 3

5

Windows は、スレッドごとに仮想メモリの連続領域 (既定では 1MB) を予約します。次に、そのメモリ領域の最上位ページをいくつかコミットし、その下のいくつかをガード ページとしてマークします。スレッドのスタックが下向きに成長するにつれて、ガード ページにアクセスすると例外が発生し、Windows はガード ページをコミットし、その下のページをガードとしてマークします。

優れた SysInternalsユーティリティVMMapを使用して、この動作を調べることができます。以下は、そのツールのスニペットです。

ここに画像の説明を入力

于 2012-09-15T12:16:11.857 に答える
3

各スレッドには独自のスタックが与えられます。それは、その目的のために割り当てられた単なるメモリの塊です。

スタックを含むすべてのメモリはページ単位で割り当てられます (Windows では、スタックはデフォルトで 1MB に設定されているため、ほとんどのメモリ ページが 4KB であることを考えると、複数のページにまたがることになります。)

しかし、それは実際には、スタック ポインター レジスターが指すメモリのチャンクにすぎません。

于 2012-09-15T11:20:25.627 に答える
1

Windows の各プログラムはプロセスです。一般に、プロセスは互いに記憶を共有しません。

共有するかどうかは、各プロセスの仮想アドレス空間が物理メモリにどのようにマップされるかという問題です。

2 つのプロセスのアドレス空間の一部が物理メモリの同じページにマップされている場合、そのメモリは効果的に共有され、各プロセスはそれを読み書きでき、他のプロセスの書き込みを観察できます。

スタック メモリを共有する意味はほとんどないため、すべてのプロセスが独自のスタックを持っています。実際、プロセスはコンテナに似ています。コードを実行してスタックを使用するエンティティはスレッドです。すべてのプロセスに少なくとも 1 つのスレッドがあります。スレッドには独自のスタックがありますが、プロセスのスレッドは同じ仮想アドレス空間にあるため、相互にスタックにアクセスできます。スレッド間でスタック上のデータを共有すると便利な場合もありますが、スレッドの状態が壊れたり、ハングやクラッシュが発生したりしないように、慎重に行う必要があります。

于 2012-09-15T11:29:59.643 に答える