如果你走入我们的内核之旅网站http://www.kerneltravel.net/ ,静下心阅读并动手实践,或许,流逝的时间,让你手捧沉甸甸的果实。 欢迎在讨论区提问。 如果你希望有即时的讨论,欢迎到西邮Linux兴趣小组:http://groups.google.com/group/xiyouLinux

内核模块编程之进阶(四)-编写带参数的中断模块

2008-02-20 17:59:34 / 个人分类:释义Linux内核

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

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


TAG: 释义Linux内核

七度黑光 helight 发布于2008-03-23 10:20:12
加载函数的变化:
在2.2之前使用init_module() 和 cleanup_module()来作为内核模块的入口函数和出口函数,但是在2.4开始它引入了宏module_init() 和 module_exit()来实现模块的注册和卸载。这些宏在头文件 linux/init.h 定义。唯一需要注意的地方是函数必须在宏的使用前定义,否则会有编译错误。从linux/init.h这里面看内核模块有两种加载方式。一种是在内核编译的时候编译到内核中的,另一种是后来再单独编译的内核模块。在2.6内核中,内核模块必须调用宏module_init 与module_exit() 去注册初始化与退出函数。在2.4 内核中,如果初始化函数命名为init_module()、退出函数命名为cleanup_module(),可以不必使用module_init 与module_exit 宏。推荐使用module_init 与module_exit宏,使代码在2.4与2.6内核中都能工作。在2.6下更是推荐使用module_init 与module_exit宏,尤其最近的版本,好像已经对2.2的那两个宏支持不是很好了
木天发布于2008-02-21 10:41:50
我是新手,看过这4帖及这个程序后简单说说我的理解,浅薄之处大家见谅~

模块就是实现特定功能的一组函数并数据结构,存在于内核空间。且因为不是一个独立完整的程序,为了不重新编译整个内核,所以要用make。
模块机制的实现用了面向对象的思想,内核通过固定的接口来执行模块加载/卸载时的初始化/清理函数。
在例子程序中,模块的初始化/清理函数分别为myirqtest_init和myirqtest_exit初始化函数尝试申请一个设备的共享中断的中断号并注册中断处理函数myinterrupt。
我来说两句

(可选)

Open Toolbar