keyboard interruptUnix系统 -电脑资料

电脑资料 时间:2019-01-01 我要投稿
【www.unjs.com - 电脑资料】

    编译成功,

keyboard interruptUnix系统

。插入内核====>系统panic 哭了 ..... MI LY: 宋体">以下这段代码能够在 X86 上很好的运行,他主要是重新分配键盘的 IRQ ,读取键盘的数据寄存器,安排队列的运行,最终打印出 scancode 的值和按键状态。 #include linux /kernel.h #include lin

编译成功。插入内核====>系统panic  哭了 .....

    MILY: 宋体">以下这段代码能够在X86上很好的运行,他主要是重新分配键盘的IRQ,读取键盘的数据寄存器,安排队列的运行,最终打印出scancode的值和按键状态。

   

    #include <linux/kernel.h>

    #include

    #include

    #include

   

    /* Bottom Half -一旦内核模块认为它做任何事都是安全的时候这将被内核调用。*/

    static void got_char(void *scancode)

    {

    printk("Scan Code %x %s.n",

    (int) *((char *) scancode) & 0x7F,

    *((char *) scancode) & 0x80 ? "Released" : "Pressed");

    }

   

    /*这个函数为键盘中断服务。它读取来自键盘的相关信息然后安排当内核认为bottom half安全的时候让它运行*/

    void irq_handler(int irq,

    void *dev_id,

    struct pt_regs *regs)

    {

    /*这些变量是静态的,因为它们需要对bottom half可见(通过指针)。*/

    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);

   

    /*安排bottom half运行*/

    #ifLINUX_VERSION_CODE > KERNEL_VERSION(2,2,0)

    queue_task(&task, &tq_immediate);

    #else

    queue_task_irq(&task, &tq_immediate);

    #endif

    mark_bh(IMMEDIATE_BH);

    }

   

   

    /*初始化模块--登记IRQ句柄*/

    int init_module()

    {

    /*既然键盘的句柄不能和我们的共存,在我们做事情前我们不得不关闭它(释放它的IRQ),

电脑资料

keyboard interruptUnix系统》(https://www.unjs.com)。

    *因为我们不知道它在哪儿,所以以后没有办法恢复它--因此当我们做完时计算机将被重新启动。

    */

    free_irq(1, NULL);

   

    /*请求IRQ 1,键盘的IRQ,指向我们的irq_handler。*/

    return request_irq(

    1, /* PC上的键盘的IRQ号*/

    irq_handler, /*我们的句柄*/

    SA_SHIRQ,

    /* SA_SHIRQ意味着我们将另一个句柄用于这个IRQ。

    *

    * SA_INTERRUPT能使句柄为一个快速中断。

    */

    "test_keyboard_irq_handler", NULL);

    }

   

    /*清除*/

    void cleanup_module()

    {

    /*它在这儿只是为了完全。它是完全不相关的,因为我们没有办法恢复通常的键盘中断因此计算机完全没用*了,需要被重新启动。*/

    free_irq(1, NULL);

    }

   

    原文转自:http://www.ltesting.net

最新文章