在此,我們將編寫一個模塊,其中有一個中斷函數(shù),當(dāng)內(nèi)核接收到某個 IRQ 上的一個中斷時會調(diào)用它。先給出全部代碼,讀者自己調(diào)試,把對該程序的理解跟到本貼后面。
—————————————-
#include <linux/module.h>
#include <linux/init.h>
#include <linux/interrupt.h>
static int irq;
static char *interface;
//MODULE_PARM_DESC(interface,”A network interface”); 2.4內(nèi)核中該宏的用法
molule_parm(interface,charp,0644) //2.6內(nèi)核中的宏
//MODULE_PARM_DESC(irq,”The IRQ of the network interface”);
module_param(irq,int,0644);
static irqreturn_t myinterrupt(int irq, void *dev_id, struct pt_regs *regs)
{
static int mycount = 0;
if (mycount < 10) {
printk(”Interrupt!\n”);
mycount++;
}
return IRQ_NONE;
}
static int __init myirqtest_init(void)
{
printk (”My module worked!11111\n”);
if (request_irq(irq, &myinterrupt, SA_SHIRQ,interface, &irq)) {
printk(KERN_ERR “myirqtest: cannot register IRQ %d\n”, irq);
return -EIO;
}
printk(”%s Request on IRQ %d succeeded\n”,interface,irq);
return 0;
}
static void __exit myirqtest_exit(void)
{
printk (”Unloading my module.\n”);
free_irq(irq, &irq);
printk(”Freeing IRQ %d\n”, irq);
return;
}
module_init(myirqtest_init);
module_exit(myirqtest_exit);
MODULE_LICENSE(”GPL”);
—————————————-
這里要說明的是,在插入模塊時,可以帶兩個參數(shù),例如
insmod myirq.ko interface=eth0 irq=9
其中 具體網(wǎng)卡 irq的值可以查看 cat /proc/interrupts
動手吧!以此為例,可以設(shè)計出各種各樣有價值的內(nèi)核模塊,貼出來體驗分享的快樂吧。