linux 内核初级教程 -4

来源:互联网 发布:java web spring 搭建 编辑:程序博客网 时间:2024/06/05 03:25

在此,我们将编写一个模块,其中有一个中断函数,当内核接收到某个 IRQ 上的一个中断时会调用它。先给出全部代码,读者自己调试,把对该程序的理解跟到本贴后面。

#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内核中该宏的用法molule_parm(interface,charp,0644) //2.6内核中的宏//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”);
这里要说明的是,在插入模块时,可以带两个参数,例如
insmod myirq.ko interface=eth0 irq=9

其中 具体网卡 irq的值可以查看 cat /proc/interrupts

原创粉丝点击