5

この図のような 8 つのウィンドウがあるとします: http://www.sics.se/~psm/sparcwin.gif

WIM は w7 を指しており、ウィンドウ w0 にいます。

このウィンドウで、1 つのパラメーターを受け取る関数を呼び出すとします。そのため、パラメーター値を %o1 に設定しました (関数が %i0 で受信できるようにするため)。

では、呼び出しを行うと、関数は「保存」を行います。そのウィンドウ ビットの WIM は 1 であるため、window_overflow がトリガーされます。これについて私が理解したのは、ハンドラーがウィンドウ w7 (%sp) のスタック、レジスター %i1,..,%i7,%l0,..,%l7 に保存して、「戻るときに」 window_underflow でそのウィンドウを回復します。

私の質問は...ウィンドウが保存されると、w7の元の%i0、...、%i7が失われたため、w0のプログラムが呼び出した関数のパラメーターです(%o0を設定したためです。 . 呼び出す前に w0 に保存してから、「保存」フォールトを作成します)。ですから、この「システム」は意味をなさないので、何かが欠けていると思います。

別の同様の質問。w0 の私のプログラムが関数を呼び出さずに %o0,%o1,.. を「ローカル」変数として使用すると仮定すると、w7 の %i0,%i1,.. を強制終了したことさえ知らずに同じ問題が発生します。

回答: 無効なウィンドウが既にスタックに保存されていることがわかりました。そのため、「保存」が完了すると、window_overflow ハンドラーは w6 をスタックに保存します (そして WIM を w6 に設定します)。これは明らかに私の質問のすべてを説明しています。このトラップのハンドラーの例を見て、V8 では常に WIM をチェックせずに CWP をデクリメントすることを思い出せずに、自分自身を混乱させたと思います。

4

0 に答える 0