私は独自の保護モード オペレーティング システムを作成しており、割り込みテーブルを変更して特定のもの (印刷文字列など) をコマンド プロンプト アプリケーションまたは他のアプリケーションにリダイレクトする方法を知る必要があります。テーブルを変更するにはどうすればよいですか?
1 に答える
まず第一に、システムコールに割り込みを使用することは、実際にそれらを実装するための「良い」方法ではありません。x64 をターゲットにしている場合は、(ユーザーの観点から) 非常に便利なカーネル コードの呼び出しを可能にするSYSCALL
とを必ず調べてください。SYSRET
それができない場合は、カーネル コードの一部をプロセスの仮想メモリ空間にマッピングすることを検討してください。linux-gate.so.1
その実装例については、Google forを参照してください。
ただし、割り込みを介してシステムコールを実装したい場合は、読み進めてください。もちろん、実際にハードウェアとやり取りするには、割り込みテーブルをいずれかの方法で変更する必要があるでしょう。
x86 の保護モードでは、割り込みは IDT (割り込み記述子テーブルの略) に配置されます。このテーブルには、タスク ゲート ディスクリプタ、割り込みゲート ディスクリプタ、またはトラップ ゲート ディスクリプタのいずれかを含めることができます。このテーブルは、リアル モード割り込みベクタ テーブルと同様の方法でインデックス付けされます。たとえば、n
テーブルの 1 番目のエントリには、割り込みの処理に使用される記述子が含まれますn
。割り込みゲートとトラップ ゲートは、実際には追加データを含む割り込みルーチン コードへのポインターにすぎませんが、タスク ゲートには、その割り込みを処理するタスクのセレクターであるタスク状態セグメント セレクターが含まれています。64 ビット モードでは、ハードウェア タスク処理の廃止により、割り込み/トラップ ゲートのみがサポートされます。
これらの問題を非常に明確に説明しているインテルのマニュアルを単純に言い換えても意味がありません。割り込み処理は、そのドキュメントの第 6 章で説明されています。