我正在練習在VirtualBox guest Linux中編寫簡單的鍵盤驅動程序。問題是,我的代碼只是註冊一箇中斷處理程序並將日誌文件打印到scancode
。而且我不會將這些傳入的掃描代碼發送到任何上位代碼,如Linux input core
。在insmod
之後,我可以看到使用dmesg
捕獲的掃描碼。但爲什麼我的終端仍然得到正確的輸入?終端不應收到任何東西。VirtualBox如何處理來賓Linux的中斷?
我的代碼如下所示:
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
atkbd
驅動程序抱怨有人要求處理IRQ_1
而不是。- 那些掃描碼可以正確打印。
- [最怪異的]主動控制檯仍然得到正確的鍵盤輸入。因此,我可以使用這個簡單的驅動程序執行
rmmod
。 rmmod
之後,來賓Linux剛剛死機,因爲它再也收不到任何鍵盤。
你有什麼想法嗎?謝謝!
因此,您正試圖編寫一個驅動程序來管理已由現有驅動程序管理的硬件(而不是附加第二個鍵盤以供您的驅動程序使用)?我想這可能不是真的可行... – twalberg
@twalberg謝謝你的評論。是的,我正在寫驅動程序來替換原來的驅動程序。這是不可能的嗎?你能否告訴我正確的做法?只在啓動時加載它? –
@twalberg而且,我只是'cat/proc/interrupts',在'IRQ 1'上看到'my_handler'和原來的'i8042'。我認爲這意味着我未能釋放原始中斷。 –