⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 intrpt.c

📁 对linux内核编程做了详细的解析和举例
💻 C
字号:
/* intrpt.c - An interrupt handler. *//* Copyright (C) 1998 by Ori Pomerantz *//* The necessary header files *//* Standard in kernel modules */#include <linux/kernel.h>   /* We're doing kernel work */#include <linux/module.h>   /* Specifically, a module *//* Deal with CONFIG_MODVERSIONS */#if CONFIG_MODVERSIONS==1#define MODVERSIONS#include <linux/modversions.h>#endif        #include <linux/sched.h>#include <linux/tqueue.h>/* We want an interrupt */#include <linux/interrupt.h>#include <asm/io.h>/* In 2.2.3 /usr/include/linux/version.h includes a  * macro for this, but 2.0.35 doesn't - so I add it  * here if necessary. */#ifndef KERNEL_VERSION#define KERNEL_VERSION(a,b,c) ((a)*65536+(b)*256+(c))#endif/* Bottom Half - this will get called by the kernel  * as soon as it's safe to do everything normally  * allowed by kernel modules. */static void got_char(void *scancode){  printk("Scan Code %x %s.\n",    (int) *((char *) scancode) & 0x7F,    *((char *) scancode) & 0x80 ? "Released" : "Pressed");}/* This function services keyboard interrupts. It reads  * the relevant information from the keyboard and then  * scheduales the bottom half to run when the kernel * considers it safe. */void 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;  static struct tq_struct task =         {NULL, 0, got_char, &scancode};  unsigned char status;  /* Read keyboard status */  status = inb(0x64);  scancode = inb(0x60);    /* Scheduale bottom half to run */#if LINUX_VERSION_CODE > KERNEL_VERSION(2,2,0)  queue_task(&task, &tq_immediate);#else  queue_task_irq(&task, &tq_immediate);#endif  mark_bh(IMMEDIATE_BH);}/* Initialize the module - register the IRQ handler */int init_module(){  /* Since the keyboard handler won't co-exist with    * another handler, such as us, we have to disable    * it (free its IRQ) before we do anything. Since we    * don't know where it is, there's no way to    * reinstate it later - so the computer will have to    * be rebooted when we're done.   */  free_irq(1, NULL);  /* Request IRQ 1, the keyboard IRQ, to go to our    * irq_handler. */  return request_irq(    1,  /* The number of the keyboard IRQ on PCs */     irq_handler,  /* our handler */    SA_SHIRQ,     /* SA_SHIRQ means we're willing to have othe     * handlers on this IRQ.     *     * SA_INTERRUPT can be used to make the     * handler into a fast interrupt.      */    "test_keyboard_irq_handler", NULL);}/* Cleanup */void cleanup_module(){  /* This is only here for completeness. It's totally    * irrelevant, since we don't have a way to restore    * the normal keyboard interrupt so the computer   * is completely useless and has to be rebooted. */  free_irq(1, NULL);}  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -