我正在练习在 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
。- 这些扫描码可以正确打印。
- [最奇怪的]活动控制台仍然获得正确的键盘输入。因此,我可以
rmmod
使用这个简单的驱动程序来执行。 - 之后
rmmod
,来宾 Linux 就死了,因为它不能再接收任何键盘了。
你有什么主意吗?谢谢!