我正在练习在VirtualBox guest Linux中编写一个简单的键盘驱动程序。问题是,我的代码只是注册了一个中断处理程序并将scancode
打印到日志文件中。我不会将这些传入的扫描码发送到任何高级代码,例如Linux input core
。在insmod
之后,我可以使用dmesg
查看捕获的扫描码。但为什么我的终端仍然得到正确的输入?终端不应该收到任何东西。
我的代码如下所示:
static int __init init_simple_keyboard_driver(void)
{
free_irq (IRQ_1, NULL);
return request_irq (IRQ_1, my_handler, ...);
}
static irqreturn_t my_handler(int irq, void *dev_id)
{
unsigned char scancode = get_scancode_from_port_0x60();
printk(...scancode...);
}
在insmod
之后,我可以在内核日志中看到消息。
free_irq
来电会导致某些消息,例如Can't free already freed IRQ
。 (我不知道为什么......它不应该被释放。)atkbd
司机抱怨有人要求处理IRQ_1
。rmmod
。rmmod
之后,来宾Linux已经死了,因为它再也无法接收任何键盘了。答案 0 :(得分:1)
驱动程序不应该也不能取消注册未自行注册的中断处理程序。 为防止原始驱动程序处理键盘中断,您可以执行ether:
1)在中断处理程序中返回IRQ_HANDLED:该值表示中断处理得很好,linux内核的中断处理机制将停止调用下一个中断处理程序。或者
2)清除硬件中的输入缓冲区,您可以参考原始键盘驱动程序的代码,以了解键盘命中事件期间使用的状态寄存器和输入缓冲区。