ユーザー モード (特権レベル 3) でいくつかのコードを実行する小さな OS を作成しています。そのユーザー レベルのコードから、メッセージを出力する OS に割り込みを呼び出したいと思います。今のところ、割り込みハンドラーがどのように引数を受け取るかなどはあまり気にしません。コードが実行されたことを割り込みハンドラーが私 (ユーザー) に通知するようにしたいだけです。
私の質問は: ユーザー モードでコードを実行するにはどうすればよいですか? コード セグメントとデータ セグメント (両方ともユーザー モード権限を持つ) を使用してローカル記述子テーブルをセットアップする機能があります。私が理解していないのは、これらのセグメントをcs
、ss
、およびにロードする方法ですds
。LDT を正常にロードしましたが、実際の使用方法がわかりません。を使うべきだと聞いたことがありますiret
が、正確な方法がわかりません。
もう 1 つの質問は、割り込みハンドラーがどのように機能するかということです。ベクタ番号 0x40 の割り込みハンドラをインストールして、"hello, user mode!" と出力したいとします。割り込みハンドラーのセットアップ方法は知っていますが、ユーザー モードからカーネル割り込みハンドラーに入ったときにコンテキストがどのように切り替わるのか正確にはわかりません。cs
ルーチンは IDT エントリで指定されたコード セグメントから実行されるため、レジスタを変更する必要があることはわかっています。スタックセレクターもおそらく変更されることも理解していますが、これについては確信が持てません。
割り込みゲートが呼び出されたときにどのようなコンテキスト変更が行われるかを誰かに説明してもらえますか?