0

重複の可能性:
スタック メモリはどのように増加しますか?

セグメンテーションを使用する OS を考えてみましょう。
私の質問は次のとおりです: os はスタック ポインターのすべての変更をインターセプトし、即座に
(または非常に瞬時に) 物理メモリ内のスペースを割り当て/割り当て解除します
か、それとも sp をデクリメントするときに必要以上のメモリを割り当てる巧妙な戦略を使用してメモリの割り当てを解除しますか?解放されたメモリが一定量に達した場合のみ?

私の質問が十分に明確であることを願っています。

4

2 に答える 2

1

あなたの質問を正しく理解できれば、答えは次のとおりです。

オペレーティング システムは、プロセスの作成の開始時に、スタックに一定量のスペースを割り当てます。スタック操作が発生すると、プロセッサはスタック ポインターを自動的にインクリメントおよびデクリメントし、ソフトウェアはスタック ポインターを自動的にインクリメントおよびデクリメントして、(関数呼び出しのように) 一時データ用のスペースを割り当てます。スタックが実際に成長し、ポインターが指定された割り当てられたスペースを超えるとスタック オーバーフローが発生するため、これはデクリメントされます。割り当てられるスペースの量は、システムによって異なります。オペレーティングシステムが実行できる唯一の「トリック」は、ページングを使用することです。この場合、メモリを割り当て済みとしてマークできますが、ソフトウェアが物理メモリを使用するまで実際には物理メモリを割り当てません。これはデマンド ページングと呼ばれ、スタックよりもヒープに適用されます。

于 2012-07-20T19:54:52.507 に答える
0

また、上記の回答に追加するには..
プロセスのスタックはヒープに向かって成長します。OSはこれらの領域が重複しないようにする必要があります。
スタックがより多くのスペースを必要とする場合 (つまり、スタック ポインタが不正または未割り当てのメモリを指している場合)、ページ フォールトが発生します。

  1. ページ フォールトの割り込みハンドラは、現在のスタック ポインタを読み取るように記述されています。スタックの成長が原因でページ フォールトが発生したかどうか、または仮想メモリの一部 (コード/データに属する) に触れたためにページ フォールトが発生したかどうかを確認するための最大制限です。まだ物理メモリにマップされています (デマンド ページング)。
  2. スタックの成長が原因でページ フォールトが発生した場合
    • スタックの最大サイズに達しているかどうかを確認します。GNu/Linux システムでは 8Mb (デフォルト) です。
    • 次に、新しいページをスタックに割り当てて、ヒープとオーバーラップするかどうかを確認します
    • これに続いて、さらにいくつかの健全性チェックが行われる場合があります。
    • 上記のすべてがパスした場合、新しいページが割り当てられます
    • チェックの 1 つが失敗した場合、実装によっては、セグ フォールトまたはスタック オーバーフローが発生します。
  3. 前のステップで新しいページを割り当てた場合、障害プロセスのスタック ポインターが更新され、新しいマッピングが障害プロセスのページ テーブルに追加され、ページ フォールト ハンドラーが制御を障害命令 (通常はプッシュ) に返します。またはプシャ(アセンブリ、x86)。

PS: 上記の手順は、pintos OS に基づく私の UG OS コースの OS 割り当てからのものです。実際の手順は異なる場合があります (Linux のような OS S では複雑になる場合があります)。スタック成長の一部へのリンクは、セクション 4.3.3 を参照してください。

于 2012-07-21T08:38:30.687 に答える