联系我们

  服务热线:
  • 杭 州 :400-889-1122
  • 上 海 :400-899-1122
  • 深 圳 :0755-88848278
  • 宁 波 :0574-87298883
  • 广 州 :400-889-1122
  • 温 州 :0577-88844623
数据恢复品牌
  • NAS服务器
  • IBM NAS HP NAS SUN NAS EMC NAS Dell NAS 联想 NAS 清华同方NAS 浪潮NAS 方正 NAS
  • 硬盘系列
  • 易拓(Excelstor) 昆腾(Quantum) 三星(SAMSUNG) 日立IBM(HITACHI) 希捷(Seagate) 迈拓(Maxtor) 西部数据(WD) 东芝(TOSHIBA) 富士通(FUJITSU)
  • 服务器系列
  • IBM系列 HP 系列 Dell系列 Sun系列 联想系列 康柏系列 浪潮系列 长城系列 曙光系列
  • 文件系统
  • windows系列 Solaris系列 Novell系列 IBM-AIX系列 MAC系列 Linux系列 SCO系列 FreeBSD系列 HP-UX系列
当前位置:技 术首页 >> unix技术 >> Linux >> linux中断共享(dev_id的使用)
linux中断共享(dev_id的使用)
2010-11-20 10:36:29  作者:  来源:互联网  浏览次数:12  文字大小:【】【】【
  从个人的理解,Linux2.6内核对中断处理程序的现在的处理可以分为两种模式,一种就是上面说的老的模式(非共享中断线),一种属于使用共享中断线的新模式,从其使用的注册中断处理程序的函数中来分析,函数原型 ...

  从个人的理解,Linux2.6内核对中断处理程序的现在的处理可以分为两种模式,一种就是上面说的老的模式(非共享中断线),一种属于使用共享中断线的新模式,从其使用的注册中断处理程序的函数中来分析,函数原型如下:

  int request_irq(unsigned int irq,

  irqreturn_t (*handler)(int, void *, struct pt_regs *),

  unsigned long irqflags,

  const char * devname,

  void * dev_id);

  参数1:中断线号

  参数2:中断处理程序函数指针

  参数3:标志掩码(SA_INTERRUPT, SA_SAMPLE_RANDOM, SA_SHIRQ)

  参数4:用于参数3为SA_SHIRQ(共享中断线)的时候,其他为NULL

  原来对于计算机设备比较少的时候,可能一个中断线好可以对应一个中断处理程序(非共享中断线),这时候参数4为NULL,没有任何用,但随着计算机设备的增加,一个中断线号对应一个中断处理程序已经不太现实,这个时候就使用了共享的中断线号,多个设备使用同一个中断线号,同一个中断设备线号的所有处理程序链接成一个链表,这样当在共享中断线号的方式下一个中断产生的时候,就要遍历其对应的处理程序链表,但这个中断是由使用同一个中断线号的多个设备中间的一个产生的,不可能链表里面的所有处理程序都调用一遍吧,呵呵,这个时候就该第四个参数派上用场了。

  因为多个设备共享同一个中断线号,当中断产生的时候到底是那一个设备产生的中断呢,这个就取决于第四个参数dev_id,这个参数必须是唯一的,也就是能区分到底是那个设备产生的中断,而且从第二个参数可以看出来,这个参数被传入中断处理程序(第二个参数),可以这么理解,当中断产生的时候,如果是共享的中断线号,则对应链表的所有中断处理程序都被调用,不过在每个中断处理程序的内部首先检查(参数信息以及设备硬件的支持)是不是这个中断处理程序对应的设备产生的中断,如果不是,立即返回,如果是,则处理完成,如果链表中没有一个是,则说明出现错误。

  下来说说中断处理程序,先看看原型:

  static irqreturn_t intr_handler(int irq, void * dev_id, struct pt_regs * regs);

  参数1:中断线号

  参数2:设备的信息,唯一确定性

  参数3:中断之前的处理器寄存器的信息和状态

  通过上面的分析,大概可以看到,参数1(中断线号)貌似有点多余,因为如果是非共享的中断线,通过中断线号直接调用处理程序,将这个参数传进去好像没什么用,如果属于共享的中断线,则通过中断线号直接找到对应的中断处理程序链表,挨个遍历,都是一个中断线号,传进去也没用,该不该调用,通过第二个参数来区分,那为什么要保留这个参数呢?答案是历史遗留问题,往后可能越来越没用了,至于为什么是历史遗留问题,可能在没有第二个参数的时候才在第一个上面做了点手脚,既然第二个参数已经添加进去了,第一个的作用就越来越少了。

  如果是共享的中断线号,则对应链表的所有中断处理程序都被调用,不过在每个中断处理程序的内部首先检查(参数信息以及设备硬件的支持)是不是这个中断处理程序对应的设备产生的中断,如果不是,立即返回,如果是,则处理完成,如果链表中没有一个是,则说明出现错误。

友情链接 | SQL数据库恢复 | 硬盘数据恢复 | Raid服务器数据恢复 | 公司简介 | 数据恢复