The kernel module programming primer(4)-Writing interrupt module with parameters

在此,我们将编写一个模块,其中有一个中断函数,当内核接收到某个 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内核中该宏的用法
module_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)
{
    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, IRQF_SHARED, 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; //返回类型为void的函数。此时return语句不是必须的,隐式的return发生在函数的最后一个语句。
}

module_init(myirqtest_init);
module_exit(myirqtest_exit);
MODULE_LICENSE(“GPL”);

这里要说明的是,在插入模块时,可以带两个参数,例如

insmod myirq.ko interface=eth0 irq=9

其中 具体网卡 irq的值可以查看

cat /proc/interrupts

动手吧!以此为例,可以设计出各种各样有价值的内核模块,贴出来体验分享的快乐吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值