2012-01-12 10 views
3

32ビットx86プロセッサ用のいくつかのOS開発の一環として、私は、ページ記述子ベクトルの割り込み記述子テーブルにタスクゲートを使用することを検討しています。その目的は、ハンドラのスタックがマッピングされることが保証されるように(また、中断されたタスクのスタックの一部がマッピングされなかった場合を避けるように)タスクスイッチを強制的に実行することです。LDTが必要ですか?

QEMUでカーネルを実行していますが、ページフォルトが発生したときにクラッシュしました(コマンドプロンプトに戻ります)。私は正確な原因を把握するのに役立つヒントを探しています。私は何かを見逃しているとか、あるいは何か誤解していると思います。ちなみに、ページ違反vecotrを割り込みゲートを使用するように設定すると、期待通りに動作するようになります。これは私が問題に遭遇するためのタスクゲートを使用しようとするときです(そして、はい、私はタスクゲートを使用しようとしています)。

IDT部分は、ページフォールトベクタのタスクゲートを正しく登録するように設定されています。セレクタは、GDT内のTSSの記述子を参照します。 GDTのTSSの記述子に関する限り、私も正しく設定されていると確信しています。

しかし、私は、TSSが適切に設定されていて、これまでのところ、すべてのフィールドの設定方法を正確に決定できなかった場合、100%確実ではありません。 esp、eip、cs、ds、es、fs、gs、ss、eflagsなどの一部は比較的単純です。しかし、LDTセグメントセレクタのようなものはあまり明確ではない。 LDTセグメントセレクタをゼロではなく、GDTのLDT記述子を指している必要がありますか?上記のシナリオで設定する必要があるフィールドはどれですか?私は時間の問題を持ってこれを考え出している。

ご協力いただければ幸いです。

+0

忘れてしまった場合でも、割り込みと例外が実行をトリガしても、タスクはまだタスクでありサブルーチンではありません。つまり、最初の割り込み/例外の処理を終了し、IRETを実行すると、その状態は、次回このIRETの直後の命令で実行を継続するようになります。 'IRET'の後に" nothing "があると、クラッシュします。 –

+0

別のことに注意してください。タスクを 'to 'に切り替えるには、タスクから' '実行する必要があります。タスクの切り替えは、常にタスクからのものであり、タスクへのものである。ページフォルトハンドラ用のTSSは1つしか作成できません。あなたは少なくとも2つの異なるものを持っていなければなりません。無効なタスク(無効な 'TR'または無効な' TSS')(例えば、間違って初期化された 'TSS'フィールド)を指している)または無効なタスクに切り替えると、例外が発生し、クラッシュする可能性があります。 –

+0

@Alex - ありがとう! – Sparky

答えて

1

正しく機能しているx86オペレーティングシステムでは、LDTは必要ありません(実際、x86-64オペレーティングシステムでは使用できません)。

使用しないようにするには、ゼロに設定します。

特に注意しなければならないことの1つは、TSSについてのosdev.orgの構造は裏返しです(http://wiki.osdev.org/TSS)。 TSSを間違って取得するとTSSフォルトの例外が発生するため、注意が必要です。

+0

これはWindowsでは禁止されていますが、Linuxでは禁止されています。 'modify_ldt(2)'はAMD64カーネルでも動作します。 – Ruslan

関連する問題