x86 Windows システムでコンテキスト切り替えスケジューラをシミュレートするコードを改良しています。このプログラムは、古い Borland C コンパイラを使用して Windows XP (編集: おそらく Windows 7 ではない) でコンパイルされ、MSVC でコンパイルできるように移植されています。
ある時点で、コードは次の使用できない機能を介して ISR をインストールしますdos.h
。
void (*)() getvect(int)
void setvect(int, void (*)());
具体的には、コードは (周期的な) タイマー割り込み用の ISR をインストールします。呼び出しは次のとおりです。
tick_isr_old = getvect(0x08);
setvect(0xF2, tick_isr_old);
setvect(0x08, (void interrupt (*)(void)) tick_isr);
setvect(0xF1, (void interrupt (*)(void)) context_switch_isr);
これらの ISR を設定する合理的な方法を知っている人はいますか (おそらく Windows API を使用しますか?)。さらに悪いことに、関数はアセンブリ言語で実装されています (結局、コンテキスト スイッチを実行する必要があります...)。整数定数 (0x08、0xF2、0xF1) が参照する割り込みベクトルに関するドキュメントは少なくともありますか? Google は、私が扱えるものを本当に思いつきませんでした。
更新: Windows 7 でこれらの DOS 呼び出しを機能させることは明らかに不可能であるため、一般にシングル スレッド環境で関数を非同期的に呼び出す方法が必要です。
Linux では関数signal()
とraise()
関数でこれを行うことができますが、Windows では可能な限り最小限の方法でしかサポートされていません。Windowsでそれを達成する方法はありますか?