发新话题
打印

内核模块编程之进阶(五)-授人以渔

内核模块编程之进阶(五)-授人以渔

在上一部分“编写带有参数的中断模块”中,这个看似简单的程序,你调试并运行以后思考了哪些方面的问题?

(1)给模块传递参数,使得这个模块的扩展和应用有了空间,例如,在我的机器上查看/proc/interrupts
   
          CPU0      
  0:   10655925    IO-APIC-edge      timer
  1:       9148         IO-APIC-edge      i8042
  6:          4          I O-APIC-edge      floppy
  7:          0          IO-APIC-edge      parport0
  8:          3           IO-APIC-edge      rtc
  9:          0           IO-APIC-fasteoi   acpi
12:      41970      IO-APIC-edge      i8042
15:     106157      IO-APIC-edge      ide1
16:      57823      IO-APIC-fasteoi   ioc0
17:       8090       IO-APIC-fasteoi   eth0
18:        245       IO-APIC-fasteoi   uhci_hcd:usb1, Ensoniq AudioPCI, usb
NMI:          0
LOC:   10249542
ERR:          0
MIS:          0

然后,在插入模块时,你对每个中断都作为参数试运行一下,看看会出现什么问题?思考一下irq为0,3等值时,
为什么插入失败?这就引出中断的共享和非共享问题,从而促使你分析Linux对共享的中断到底如何处理,共享同一个中断号的中断处理程序到底如何执行?

2. 对于myinterrupt()函数,可以进行怎样的改进,使得这个自定义的中断处理程序变得有实际意义?
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;
}


比如,对于网卡中断,在此收集每一次中断发生时,从网卡接收到的数据,把其存入到文件中。以此思路,随你考虑应用场景了。

3. 模块机制给Linux内核的扩展和应用提供了方便的入口,在我们内核之旅http://www.kerneltravel.net  的电子杂志部分,针对内核相关的内容,每一部分都有相对比较实际的内核应用题目,感兴趣者可以去实践,前提是对内核相关内容的彻透理解。


  



[ 本帖最后由 陈莉君 于 2008-2-23 10:40 编辑 ]
透析真谛,似拨云穿雾;共享智慧,如春风沐浴
http://www.kerneltravel.net

TOP

对中断函数的一点测试及应用

irqreturn_t short_interrupt(int irq, void *dev_id, struct pt_regs *regs)
         {
            static long mytime=0;
            static int i=0;
            struct net_device *dev=(struct net_device *)dev_id;

            if(i==0){
            mytime=jiffies;
            }else
               if(i<20){   
            mytime =jiffies- mytime;
            printk("Request on IRQ %d time %d\n",irq , mytime);
            mytime=jiffies;
            printk("Interrupt on %s -----%d \n",dev->name,dev->irq);
            }

            i++;
            return IRQ_HANDLED;
         }
这个函数实现的只是对两次发生中断的时间间隔的统计,时间单位是毫秒

TOP

发新话题