我正在VirtualBox来宾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
- 这些扫描码可以正确打印
- [The Most Weird One]活动控制台仍然可以获得正确的键盘输入。因此,我可以使用这个简单的驱动程序执行
rmmod
rmmod
之后,来宾Linux就死了,因为它再也无法接收任何键盘了
你知道吗?非常感谢。
驱动程序不应该也不能取消注册未自行注册的中断处理程序。为了防止原始驱动程序处理键盘中断,您可以执行ether:
1) return中断处理程序中的IRQ_HANDLED:该值表示中断处理良好,linux内核的中断处理机制将停止调用下一个中断处理程序。或
2) 清除硬件中的输入缓冲区,您可以参考原始键盘驱动程序的代码来了解键盘敲击事件期间使用的状态寄存器和输入缓冲区。