0

PIC の観点から、IRQ が特別な割り込み記述子テーブル (IDT) エントリにどのようにマップされるかを知りたいと思っています。ここのリンクは、バスライン0xffを使用して割り込みマスクレジスタとして設定することにより、すべての IRQ を無効にする方法を説明しています。0x210xA1

キーボードが 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);

上記のコードを実行した後、キーボードが無効になりません。また、すべての割り込みを無効にするように設定%al0xffましたが、それでも機能しません。

だから私は次の質問があります:

  1. PIC からの特別な IRQ 割り込み (キーボードの IRQ1 など) を (Linux の定義済み関数を使用せずに) 無効にする方法は?
  2. IDT からエントリoffsetを選択するために (Linux などで) 使用されているを知るにはどうすればよいですか?offset+IRQ Number

3番目の質問については、オフセットによって次のことを意味します。

キーが押されると、キーボードは割り込みライン IRQ1 に沿って PIC に信号を送信します。PIC には、PIC の初期化中に格納されたオフセット値があります。入力行番号をこのオフセットに追加して、割り込み番号を形成します。次に、プロセッサは、割り込み記述子テーブル (IDT) と呼ばれる特定のデータ構造を検索して、割り込み番号に対応する割り込みハンドラ アドレスを取得します。

4

0 に答える 0