私はexeスタックがどこにあるかについて少し混乱しています..プログラムが実行される前にCRTがヒープの量を割り当てることによってヒープを初期化することを知っています(ページを割り当てるOSによって割り当てられます)が、どこにあるスタック?ページにもありますか?それとも、GDT で ring3 記述子を使用して、ユーザー モード (ring3) のすべてのプログラムで共有されますか (そうではないと思いますが、よくわかりません)。
3 に答える
各スレッドには独自のスタックが与えられます。それは、その目的のために割り当てられた単なるメモリの塊です。
スタックを含むすべてのメモリはページ単位で割り当てられます (Windows では、スタックはデフォルトで 1MB に設定されているため、ほとんどのメモリ ページが 4KB であることを考えると、複数のページにまたがることになります。)
しかし、それは実際には、スタック ポインター レジスターが指すメモリのチャンクにすぎません。
Windows の各プログラムはプロセスです。一般に、プロセスは互いに記憶を共有しません。
共有するかどうかは、各プロセスの仮想アドレス空間が物理メモリにどのようにマップされるかという問題です。
2 つのプロセスのアドレス空間の一部が物理メモリの同じページにマップされている場合、そのメモリは効果的に共有され、各プロセスはそれを読み書きでき、他のプロセスの書き込みを観察できます。
スタック メモリを共有する意味はほとんどないため、すべてのプロセスが独自のスタックを持っています。実際、プロセスはコンテナに似ています。コードを実行してスタックを使用するエンティティはスレッドです。すべてのプロセスに少なくとも 1 つのスレッドがあります。スレッドには独自のスタックがありますが、プロセスのスレッドは同じ仮想アドレス空間にあるため、相互にスタックにアクセスできます。スレッド間でスタック上のデータを共有すると便利な場合もありますが、スレッドの状態が壊れたり、ハングやクラッシュが発生したりしないように、慎重に行う必要があります。