J'écris un exemple de module noyau simple sur l'utilisation du gestionnaire d'interruption. Le module interrompt les interruptions du clavier. Il lit les informations pertinentes à partir du clavier, puis met des informations sur la touche que vous avez appuyée. Il insmode avec succès le module dans le noyau et interrompt bien le travail.
Cependant, quand je fais le module rmmod, la LED sur Caps Lock clignote et mon PC est gelé (je le lance sur la machine Vmware). Je pense que j'ai les bugs dans la fonction __exit. Mais je ne sais pas comment réparer. Quelqu'un peut-il m'aider? Merci beaucoup.
Le code:Programmation du module noyau (gestionnaire d'interruption)
/*
* An interrupt handler
*/
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/sched.h>
#include <linux/workqueue.h>
#include <linux/interrupt.h>
#include <asm/io.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Hai Dang Hoang");
/*
* This function services keyboard interrupts. It reads the relevant
* information from the keyboard and then puts information about Key that pressed
* This example only has 3 key: ESC, F1, and F2
*/
irqreturn_t irq_handler(int irq, void *dev_id, struct pt_regs *regs)
{
/*
* This variables are static because they need to be
* accessible (through pointers) to the bottom half routine.
*/
static unsigned char scancode;
unsigned char status;
/*
* Read keyboard status
*/
status = inb(0x64);
scancode = inb(0x60);
switch (scancode)
{
case 0x01: printk (KERN_INFO "! You pressed Esc ...\n");
break;
case 0x3B: printk (KERN_INFO "! You pressed F1 ...\n");
break;
case 0x3C: printk (KERN_INFO "! You pressed F2 ...\n");
break;
default:
break;
}
return IRQ_HANDLED;
}
/*
* Initialize the module - register the IRQ handler
*/
static int __init irq_ex_init(void)
{
/* Free interrupt*/
free_irq(1,NULL);
return request_irq (1, (irq_handler_t) irq_handler,IRQF_SHARED, "test_keyboard_irq_handler",(void *)(irq_handler));
}
static void __exit irq_ex_exit(void)
{
free_irq(1,NULL);
}
module_init(irq_ex_init);
module_exit(irq_ex_exit);
Ou vous pouvez voir mon code sur mon lien GitHub: Example interrupt handler
Je suis curieux de savoir comment vous avez exécuté la commande rmmod, car le gestionnaire de votre module ne supporte pas les entrées alphabétiques. – Ash
que voulez-vous dire les entrées de l'alphabet? –
vous avez supprimé le module de clavier intégré dans votre fonction init, maintenant votre module est seul responsable des interruptions de clavier. Étant donné que le gestionnaire d'interruption de votre module est implémenté pour ESC, F1 et F2, comment le terminal prend des entrées pour "rmmod", je suis très nouveau pour les pilotes de périphériques s'il vous plaît aidez-moi à comprendre cela. – Ash