Chinaunix首页 | 论坛 | 博客
  • 博客访问: 121717
  • 博文数量: 41
  • 博客积分: 1410
  • 博客等级: 上尉
  • 技术积分: 306
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-01 10:41
文章分类

全部博文(41)

文章存档

2011年(1)

2009年(40)

我的朋友

分类:

2009-04-09 15:43:12

在此,我们将编写一个模块,其中有一个中断函数,当内核接收到某个 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

 

阅读(781) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2009-04-10 17:56:47

编译完成了后可以用insmod myirq.ko来加载模块,而且用lsmod都可以看到 ,rmmod也可以卸载 但是用modprobe加载的时候始终是报错: modprobe myirq.ko FATAL: Module hello_module.ko not found 不用后缀和改成.o后缀都不行 我把它放到/lib/module/uname -r 下面也不行。 解决: 放在/lib/modules/`uname -r`/kernel/下面, 运行depmod -a, 然后再试试

chinaunix网友2009-04-10 17:39:06

在myirqtest_init()函数中,有一个SA_SHIRQ,make的时候出现SA_SHIRQ undeclare的错误,因为SA_SHIRQ 已经不支持了,应用 IRQF_SHARED。