Linux中的中断是否排队

Linux中的中断是否排队,linux,linux-kernel,x86,linux-device-driver,interrupt,Linux,Linux Kernel,X86,Linux Device Driver,Interrupt,我编写了一个示例驱动程序,它在几秒钟内禁用键盘中断,当我在这段时间内按键时,当中断被启用时,控制台上的按键就会被按下 #include <linux/module.h> #include <linux/init.h> #include <linux/delay.h> #include <linux/irqflags.h> #include <linux/interrupt.h> unsigned int irq = 1; modul

我编写了一个示例驱动程序,它在几秒钟内禁用键盘中断,当我在这段时间内按键时,当中断被启用时,控制台上的按键就会被按下

#include <linux/module.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/irqflags.h>
#include <linux/interrupt.h>

unsigned int irq = 1;

module_param(irq, int, 0);

static int __init my_init(void)
{
    pr_info("module is loaded on processor:%d\n", smp_processor_id());
    pr_info("Disabling Interrupt:%u\n", irq);
    disable_irq(irq);
    pr_info("Disabled Interrupt:%u\n", irq);
    mdelay(10000L);
    pr_info("Enabling Interrupt:%u\n", irq);
    enable_irq(irq);
    pr_info("Enabled Interrupt:%u\n", irq);
    return 0;
}

static void __exit my_exit(void)
{
}

MODULE_LICENSE("GPL");
module_init(my_init);
module_exit(my_exit);
#包括
#包括
#包括
#包括
#包括
无符号整数irq=1;
模块_参数(irq,int,0);
静态int\uu init my\u init(void)
{
pr_info(“模块加载到处理器:%d\n”,smp_处理器_id());
pr_info(“禁用中断:%u\n”,irq);
禁用irq(irq);
pr_info(“禁用的中断:%u\n”,irq);
mdelay(10000升);
pr_info(“启用中断:%u\n”,irq);
启用irq(irq);
pr_info(“已启用的中断:%u\n”,irq);
返回0;
}
静态无效\uu退出我的退出(无效)
{
}
模块许可证(“GPL”);
模块_init(我的_init);
模块退出(我的退出);

在键盘控制器中按住几次按键,直到软件读取为止。如果在中断被禁用时按了多个键,一些键将丢失。我认为限制大约是8或16。还有一个挂起的中断被保存在中断控制器中,并在中断重新启用时被传递。当收到中断时,软件会读取所有排队的按键,而不仅仅是第一次。@prl:你应该把它作为一个答案来写…@caf,,这不是一个很好的答案,因为我想到的是8042键盘控制器,但毫无疑问他使用的是USB键盘。(这可能就是他看到超过16个键被缓冲的原因。)(我仍然会看看是否能给出正确的答案。)我在键盘控制器中缓冲的问题上弄错了。当键盘控制器从键盘接收到扫描代码时,它会向键盘发出信号,在软件读取输出缓冲区之前,不再发送任何扫描代码。因此,任何缓冲都在键盘本身。