ユーザーモード(特権レベル3)でいくつかのコードを実行する小さなOSを作成しています。そのユーザーレベルのコードから、メッセージを出力するOSに割り込みを戻したいと思う。今私は本当に私の割り込みハンドラがそのような引数を取るかどうか気にしない、私は実際には割り込みハンドラがコードが実行されたことを私(ユーザー)に通知したい。iretを使用してユーザーモードに切り替える
私の質問は、ユーザーモードでコードを実行するにはどうすればいいですか?私は、ローカルディスクリプタテーブルをコードセグメントとデータセグメント(両方ともユーザーモード権限を持つ)で設定する関数を持っています。私が理解できないことは、これらのセグメントをcs
,ss
、およびds
にロードする方法です。私は正常に私のLDTを読み込みますが、実際にどのように使用するのか分かりません。私はiret
を使うべきだと聞いたことがありますが、どういうふうには分かりません。
私が持っているもう1つの質問は、割り込みハンドラがどのように動作するかです。ベクタ番号0x40の割り込みハンドラをインストールして、 "hello、user mode!"を出力したいとしましょう。私は割り込みハンドラを設定する方法を知っていますが、ユーザモードからカーネル割り込みハンドラに入るときにコンテキストがどのように切り替わるかを正確に理解していません。 cs
レジスタは変更する必要があります。私のルーチンはIDTエントリで指定されたコードセグメントから実行されるためです。私はまた、スタックセレクタもおそらく変化することを理解していますが、私はこれを確信することはできません。
誰かが割り込みゲートが呼び出されたときにどのようなコンテキスト変更が行われたのか教えてください。
申し訳ありません、あなたは私の質問に答えました。私が今理解していることは、私がカーネルスタックを含んでいるTSSを持っている必要があるということです。助けてくれてありがとう。 –
私はこれをupvoteにちょうどログインしました!ありがとう!そこにいる他の人たちのために、私はosdevとIntel ISAマニュアルもお勧めします。彼らは本当に物事をクリアします。 – Sid
IRETはデータセグメントを変更しないとはどういう意味ですか?汎用レジスタ内の値について話していますか? –