2

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でそれを達成する方法はありますか?

4

2 に答える 2

1

BIOS 割り込みに関するウィキペディアのエントリを参照してください。それは言います:

08h IRQ0: システム タイミング コンポーネントによって実装されます。プログラマブル インターバル タイマーによって毎秒 18.2 回 (55 ms ごとに 1 回) 呼び出される

ただし、Windows 7 では、割り込みにアクセスするためにカーネル モード ドライバーを作成する必要があります。

Windowsユーザー モードのスケジューリングファイバーを使用して、スケジューラの割り込みをエミュレートできる場合があります。

于 2012-08-08T18:10:49.383 に答える
1

tick_isr と context_switch_isr は、DOS 環境用のコンテキスト切り替えを実装しているため、必ず置き換える必要があります。賢明に実行できたとしても、既存のコードが Windows で意味のあることを行う方法はありません。

元のコードでは、コンテキスト スイッチはプリエンプティブであるため、おそらくそのロジックを完全に削除して、代わりに Windows スレッドを使用することができます。おそらく、既存のコードにはコンテキストを作成および削除するためのルーチンがいくつかあり、これらは対応する Windows API スレッド関数に置き換えることができます。

一度に 1 つのスレッドのみが実行されるようにする必要がある場合は、SetProcessAffinityMaskを使用してプロセスを単一の CPU に関連付けることができます。

または、デバッグ関数GetThreadContextおよびSetThreadContextを使用して、独自のコンテキスト切り替えを実装することもできます。この状況では、メイン プログラム コード用の 1 つのスレッドと、コンテキスト スイッチャーを実行する 2 番目のスレッドがあります。

于 2012-08-09T20:49:26.773 に答える