0

我想知道,IRQ 如何从 PIC 角度映射到特殊的中断描述符表 (IDT) 条目。此处的链接描述了如何通过使用和总线设置0xff为中断屏蔽寄存器来禁用所有 IRQ 。0x210xA1

我知道键盘会产生一个 IRQ1 中断,所以如果我想禁止 CPU 接收每个 IRQ1,我应该将第一个(第二个)位设置为 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(不使用 Linux 预定义函数)禁用特殊的 IRQ 中断(例如键盘的 IRQ1)?
  2. 如何知道offset在(例如Linux)中用于offset+IRQ Number从IDT 中选择条目的那个?

对于第三个问题,我的意思是:

当一个键被按下时,键盘沿其中断线 IRQ1 向 PIC 发出一个信号。PIC 在 PIC 初始化期间存储了一个偏移值。它将输入行号添加到此偏移量以形成中断号。然后处理器查找称为中断描述符表(IDT)的特定数据结构,以给出与中断号对应的中断处理程序地址。

4

0 回答 0