快速业务通道

linux中断处理之初始化

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-15
的值装载cs、eip和eflag寄存器.如果一个硬件出错码曾被压入栈中,并且在eip内容的上面,那么,执行iret指令前先弹出这个硬件出错码.

  2. 检查处理程序的CPL是否等于cs中的低两位的值.如果是,iret终止返回;否则,转入下一步.

  3. 从栈中转载ss和esp寄存器,因此,返回到与旧特权级相关的栈.

  4. 检查ds、es、fs及gs段寄存器的内容,如果其中一个寄存器包含的选择符是一个段描述符,并且其DPL值小于CPL,那么,清相关的段寄存器.控制单元这么做是为了禁止用户态的程序利用内核以前所用的段寄存器.如果不清除这些寄存器的话,恶意的用户程序就会利用他们来访问内核地址空间.

  注意到4:举例说明一下.如果通过系统调用进入内核态.然后将DS,ES的值赋为__KERNEL_DS(在2.4的内核里),处理完后(调用iret后),恢复CS,EIP的值,此时CS的CPL是3.DS,ES被设为了__KERNEL_DS,其DPL是0,要将DS,ES中的值清除.在2.6内核中,发生中断或异常后,将DS,ES的值设为了__USER_DS,避免了上述的清除过程,提高了效率.

  三:重要的数据结构

  在深入源代码之前,先把所用到的数据结构分析如下:

  Irq_desc[]定义如下:

  extern irq_desc_t irq_desc [NR_IRQS]

  typedef struct irq_desc {

  unsigned int status; /* IRQ的状态;IRQ 是否被禁止了,有关IRQ 的设备当前是否正被自动检测*/

  hw_irq_controller *handler;/*指向一个中断控制器的指针*/

  c *action; /* 挂在IRQ上的中断处理程序 */

  unsigned int depth; /* 为0:该IRQ被启用,如果为一个正数,表示被禁用 */

  unsigned int irq_count; /* 该IRQ发生的中断的次数 */

  unsigned int irqs_unhandled; /*该IRQ线上没有被处理的IRQ总数*/

  spinlock_t lock;

  } ____cacheline_aligned irq_desc_t;

  Hw_irq_controller定义如下:

  struct hw_interrupt_type {

  const char * typename; /*中断控制器的名字*/

  unsigned int (*startup)(unsigned int irq); /*允许从IRQ线产生中断*/

  void (*shutdown)(unsigned int irq); /*禁止从IRQ线产生中断*/

  void (*enable)(unsigned int irq); /*enable与disable函数在8259A中与上述的startup shutdown函数相同*/

  void (*disable)(unsigned int irq);

  void (*ack)(unsigned int irq); /*在IRQ线上产生一个应答*/

  void (*end)(unsigned int irq); /*在IRQ处理程序终止时被调用*/

  void (*set_affinity)(unsigned int irq, cpumask_t dest); /*在SMP系统中,设置IRQ处理的亲和力*/

  }

  typedef struct hw_interrupt_type hw_irq_controller;

  struct irqaction定义如下:

  struct irqaction {

  //中断处理例程

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

  //flags:

  //SA_INTERRUPT:中断嵌套

  //SA_SAMPLE_RANDOM:这个中断源于物理随机性

  //SA_SHIRQ:中断线共享

  unsigned long flags;

  //在x86平台无用

  cpumask_t mask;

  //产生中断的硬件名字

  const char *name;

  //设备ID,一般由厂商指定

  void *dev_id;

  //下一个irqaction.共享的时候,通常一根中断线对应很多硬件设备的中断处理例程

  struct irqaction *next;

  }

  可以用下图来表示上述数据结构的关系:

  四:idt在保护模式下的初始化

  有关实模式下的初始化,以后再做专题分析.详情请关注本站更新.

  在init/main.c中:

  asmlinkage

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号