Ò»¸ö³ÌÐò,Çë´ó¼Ò¿´¿´
kernel panic,ÔÒò²»Ã÷ÎÒ·ÂÕÕÒ»¸öÈÕÖ¾.дÁËÒ»¸ö2.4Äں˵ļüÅÌÖжÏ,±àÒëͨ¹ý,µ«ÊÇÒ»¼ÓÔØ¾Í»áËÀ»ú,Çë¸ßÊÖ°ïæ¿´Ò»ÏÂ.¼±!~~!ллÁË
#include<linux/config.h>
#include<linux/module.h>
#include<linux/kernel.h>
#include<linux/init.h>
#include<linux/modversions.h>
#include<linux/version.h>
#include<linux/fs.h>
#include<linux/sched.h>
#include<linux/errno.h>
#include <linux/irq.h>
#include<linux/interrupt.h>
#include<asm/io.h>
#include<linux/tqueue.h>
#include<linux/list.h>
MODULE_LICENSE("GPL");
static void got_char(void *scancode)
{
printk("sth happened ,oh yes!\n");
printk("scan code %x %s.",(int)*((char*)scancode)&0x7f);
}
void key_sever(int irq, void *dev_id, struct pt_regs *regs)
{
printk("mouse key down\n");
static unsigned char scancode;
static struct tq_struct task;
LIST_HEAD(key_sever);
INIT_LIST_HEAD(&key_sever);
task.sync=0;
task.routine=got_char;
task.data=&scancode;
unsigned char status;
scancode=inb(0x60);
printk("inb started\n");
queue_task(&task,&tq_immediate);
mark_bh(IMMEDIATE_BH);
printk("mission started\n");
printk("register device ok\n");
}
int __init mou_init(void)
{
free_irq(1,NULL);
int keytesta=1;
int result;
result=request_irq(1,key_sever,SA_SHIRQ,"keytest",&keytesta);
if (result==0)
{
printk("request ok\n");
}
else
{
printk("failed\n");
}
return 0;
}
void __exit mou_exit(void)
{
free_irq(1,NULL);
printk("<1>goodbye\n");
}
module_init(mou_init);
module_exit(mou_exit); û´ó¸çÃǻشðÂð?:( Ê×ÏÈÉùÃûһϱ¾È˵ÄCˮƽһ°ã°ã£¬ÎÒÖ»ÏëÎÊLZÁ½¸öÎÊÌ⣺
1.ÄãµÄmain£¨£©ÔÚÄÇÀ
2.ÎÒ´Óû¼û˵¹ýprintk()¿âº¯Êý£¬Ö»Ìý˵¹ýprintf()¿âº¯Êý¡£ Õâ¸öÊÇÓÃÇý¶¯µÄ·½Ê½½øÐмÓÔØ,printkÊǺË̬´òÓ¡Êä³öÓï¾ä,ÓÃdmesg¿ÉÒÔ¿´µÄµ½,µÈ°¡,Ï£Íû¸ßÊÖÖ¸µã,ºÜÓôÃÆ ÄãÈ·¶¨free_irqºÍrequest_irqÊÇÕâôÓõÄÂ𣿠ÎÒ²»ÊǷdz£È·ÐÅ,²»¹ýÎÒ¿´µ½ÓÐÈËÕâÑù³É¹¦ÁË,µ«ÊÇÎÒ»¹ÕÒ²»³öÎÊÌâ תµ½Äں˰濴¿´
Ò³:
[1]