4

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

QEMUでカーネルを実行していますが、ページフォールトが発生すると、クラッシュすることがわかりました(コマンドプロンプトに戻ります)。私は正確な原因を理解するのに役立つかもしれないヒントを探して読んで掘り下げてきました。何かが足りない、または何かを誤解していると思います。ちなみに、割り込みゲートを使用するようにページフォールトvecotrを設定すると、期待どおりに動作させることができます。このためにタスクゲートを使おうとすると、問題が発生します(もちろん、タスクゲートを使い続けたいと思います)。

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

ただし、TSSが適切に設定されていて、これまですべてのフィールドを正確に設定する方法を決定できなかったかどうかは、100%確実ではありません。esp、eip、cs、ds、es、fs、gs、ss、eflagsなどのいくつかは比較的単純です。ただし、LDTセグメントセレクターなどの他のものはあまり明確ではありません。LDTセグメントセレクターはゼロ以外であり、GDTのLDT記述子を指している必要がありますか?上記のシナリオでは、これらのフィールドのどれを設定する必要がありますか?私はこれを理解するのにかなりの時間を費やしています。

どんな助けでも大歓迎です。

4

1 に答える 1

0

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

使用しないようにするには、ゼロに設定してください。

特に注意すべき点が 1 つあります。TSS に関する osdev.org の構造は、前後逆になっています (http://wiki.osdev.org/TSS)。TSS を間違えると TSS-fault 例外が発生するため、注意が必要です。

于 2012-05-14T08:14:40.760 に答える