2016-05-05 32 views
3

私はPnP BIOS specificationを読み、次の段落に出くわしています:「割り込みフック」とはどういう意味ですか?

は積極的に、現在のシステムBIOS アーキテクチャは、オプションROMが無差別にINT 19hをフックすることを可能にするINT 19hのブートストラップベクトル

を監視します。 INT 19hの制御をアクティブに監視することにより、システムBIOSはブートストラッププロセスの制御を復活させ、オペレーティングシステム が適切なデバイスから適切な方法でロードされていることを確認することができます。

オンラインでは、割り込みを「フックする」可能性が言及されています。私が知る限り、すべてのISRで特別な通知機能を呼び出すなど、割り込みの発行を監視してOSに発火割込みを追跡させることを意味します。あれは正しいですか?
どういう意味ですか?

答えて

2

割り込みがリアルモードで発生すると、CPUはInterrupt Vector Tableで指定されている割り込みのハンドラに実行を転送します。

このコンテキストで割り込みをフックするとは、割り込みベクタテーブル内のエントリ19hのアドレスを、選択した別のアドレスを指すように変更することを意味します。その後、割り込み19hが起動されると、そのアドレスから始まる独自のルーチンが実行され、復帰する前に制御が元の19h割り込みハンドラに戻される可能性があります。

割り込みハンドラがRAMに配置されていると仮定すると、割り込みのハンドラ内にインラインフックを配置する方法があります(19h)。すなわち、割込みハンドラのアドレスだけを残すことができるが、ハンドラ内の命令の1つをjmp(またはcall)でそれらのルーチンに置き換えることができる。このような状況では、このタイプのフッキングを監視するかどうかは不明です。


編集:文書をスキミングした後、フックの最初のスタイルは、彼らが話していたものであることが表示されます。

... IPLデバイスは、システムBIOSに知られている場合は、 割り込み19hとはまだ、システムBIOSによって制御されていることを確認してください。 ない場合は、割り込み19Hを奪還し、ベクトルを保存...

を...オペレーティングシステムのロードに失敗し、前のISAオプションROM は、割り込み19hのベクトルの制御を持っていた場合は、割り込み19Hを復元ISAオプションROM、再度実行割り込み19hのブートストラップローダへのベクトル...

ので、基本的には、ブートプロセスの特定の部分で、彼らはオプションROMがためのハンドラを変更したかどうかを確認します割り込み19h。変更されている場合は、新しいハンドラのアドレスを保存し(後で実行することもできます)、元のハンドラをIVTに戻します。

2

はい、「フッキング」とは、割り込みが発生したときにコードが実行されることを意味しますが、機能が完了したら置き換えたハンドラにジャンプします。そのため、割り込みを完全に引き継ぐのではなく、関数をハンドラのチェーンの先頭に追加しました。

IDTを関数ポインタのグローバル配列として想像してみてください。

extern void (*IDT[256])(void); 

static void (*old_handler)(void); 
void my_handler(void) { 
    // do stuff ..., then: 
    old_handler(); 
} // tail-call optimized to a jmp 

void install_handler(int irq) { 
    old_handler = IDT[irq]; 
    IDT[irq] = my_handler; 
} 
void uninstall_handler(int irq) { // Don't forget this part when you unload your code 
    IDT[irq] = old_handler; 
} 

あなたは本当のIDTをフックするために使用したいコードのこのcompiles toまさに種類:Cでは、それは次のようになります。

関連する問題