PIC の観点から、IRQ が特別な割り込み記述子テーブル (IDT) エントリにどのようにマップされるかを知りたいと思っています。ここのリンクは、バスライン0xff
を使用して割り込みマスクレジスタとして設定することにより、すべての IRQ を無効にする方法を説明しています。0x21
0xA1
キーボードが IRQ1 割り込みを生成することがわかっているので、すべての IRQ1 が CPU によって受信されないようにするには、最初の (2 番目の) ビットを 1 に設定する必要があります。
次の Linux カーネル モジュールを作成しました。
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/preempt.h>
int __init hello_start(void)
{
asm volatile(
"in $0x21,%al\n\t"
"or $0x2, %al\n\t"
"out %al, $0x21\n\t"
);
return 0;
}
static void __exit hello_end(void)
{
}
module_init(hello_start);
module_exit(hello_end);
上記のコードを実行した後、キーボードが無効になりません。また、すべての割り込みを無効にするように設定%al
し0xff
ましたが、それでも機能しません。
だから私は次の質問があります:
- PIC からの特別な IRQ 割り込み (キーボードの IRQ1 など) を (Linux の定義済み関数を使用せずに) 無効にする方法は?
- IDT からエントリ
offset
を選択するために (Linux などで) 使用されているを知るにはどうすればよいですか?offset+IRQ Number
3番目の質問については、オフセットによって次のことを意味します。
キーが押されると、キーボードは割り込みライン IRQ1 に沿って PIC に信号を送信します。PIC には、PIC の初期化中に格納されたオフセット値があります。入力行番号をこのオフセットに追加して、割り込み番号を形成します。次に、プロセッサは、割り込み記述子テーブル (IDT) と呼ばれる特定のデータ構造を検索して、割り込み番号に対応する割り込みハンドラ アドレスを取得します。