9

OS:Windows7 32bit

したがって、C++ と同様に、ヒープとスタックがあります。しかし、私は最近いくつかのアセンブリ学習を開始しており、そのようなものは何も見ていません。スタックだけですが、純粋なメモリのように見えます。では、ヒープとスタックの実装は c++ やその他の言語に固有のものですか? それとも、まだアセンブリにヒープとスタックが割り当てられていますか? 実行可能ファイルを起動するとき、プロセスにメモリを割り当てるという点でウィンドウは何をしますか? また、プロセスはどのようにして必要なスタック サイズを知るのでしょうか?

どうした

編集:おそらく誰かが CPU/OS によってプロセスのヒープとスタックメモリがどのように処理されるかについてのリンクを提供することができます

4

2 に答える 2

13

私の知識のほとんどは Windows 固有のものではないので、ご容赦ください。

ヒープとスタックはメモリ内の異なる領域を参照します (ただし、いずれの場合もメイン メモリについて話しているにすぎません)。これは特定の言語に限ったことではありません。ヒープは下位メモリ アドレスに存在し、上に向かって成長します。スタックは上位メモリ アドレスに存在し、下に向かって成長します。これは、それらが重ならないようにするためです (これは非常に悪いことです)。

32 ビット アーキテクチャでは、EBP および ESP レジスタが現在のスタック フレームを追跡します。EBP はベース ポインターです。これは、現在のスタック フレームの上位アドレスを指します。ESP はスタック ポインターであり、現在のスタック フレームの下位アドレスを指します。

解放/割り当て済みのヒープとスタック メモリの概念は、ほとんどがアプリケーション レベルに関係することに注意してください。マシン レベルでは、すべてのメモリは同じように見えます。使用中のメモリ セグメントを追跡するのは、プログラマ (またはコンパイラ) 次第です。

スタックは、関数を呼び出す命令と、EBP および ESP への明示的な変更の組み合わせによって管理されます。ESP を下回るものはすべて解放されたと見なされます。メモリを解放するには、ESP に追加するだけです。

ヒープはメモリ割り当て方法によって管理されます。ドキュメントはここにあります。Winows の詳細についてはよくわかりませんが、一般に、メモリのブロックが複数のアプリケーションに割り当てられていないことを確認する責任を持つメモリ マネージャがいくつかあります。

于 2010-03-11T03:24:27.577 に答える
11

スタックは主に CPU (PUSH/POP/CALL/RET コマンド) によって維持されます。ヒープは、純粋に OS/ランタイム ライブラリ機能です。したがって、アセンブリではスタック アクセスが自然です。ヒープ アクセスの場合は、アセンブリ コード (HeapAlloc/HeapFree、またはその他のライブラリ) から関連する API を呼び出すだけです。スタックとは異なり、アセンブリ言語にはヒープ メモリ管理用の低レベルのプリミティブはありません。

Windows ではスタック サイズを気にする必要はありません。どんどん使い込んでいくと透明に成長していきます。低レベルの用語では、Windows はスタックの下部にガード メモリ ページを設定します (スタックが下に成長すると仮定します)。スタックがガード ページに到達すると、CPU でアクセス違反例外が生成されます。Windows カーネルはそれをキャッチし、状況に気づき、スタックを拡張します。

于 2010-03-11T03:37:41.200 に答える