我想知道,IRQ 如何从 PIC 角度映射到特殊的中断描述符表 (IDT) 条目。此处的链接描述了如何通过使用和总线设置0xff
为中断屏蔽寄存器来禁用所有 IRQ 。0x21
0xA1
我知道键盘会产生一个 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);
运行上述代码后,它不会禁用我的键盘。我还设置%al
为0xff
禁用所有中断,但它仍然不起作用。
所以我有以下问题:
- 如何从 PIC(不使用 Linux 预定义函数)禁用特殊的 IRQ 中断(例如键盘的 IRQ1)?
- 如何知道
offset
在(例如Linux)中用于offset+IRQ Number
从IDT 中选择条目的那个?
对于第三个问题,我的意思是:
当一个键被按下时,键盘沿其中断线 IRQ1 向 PIC 发出一个信号。PIC 在 PIC 初始化期间存储了一个偏移值。它将输入行号添加到此偏移量以形成中断号。然后处理器查找称为中断描述符表(IDT)的特定数据结构,以给出与中断号对应的中断处理程序地址。