Chinaunix首页 | 论坛 | 博客
  • 博客访问: 21785
  • 博文数量: 5
  • 博客积分: 110
  • 博客等级: 入伍新兵
  • 技术积分: 60
  • 用 户 组: 普通用户
  • 注册时间: 2011-05-18 11:01
文章分类

全部博文(5)

文章存档

2011年(5)

我的朋友

分类: LINUX

2011-05-26 17:05:44

  arm 中发生中断时,cpu执行如下动作:
       1:将被中断任务模式的CPSR值保存到IRQ模式中的SPSR寄存器中;

      2:将被中断任务模式的PC值保存到IRQ模式中的LR寄存器中;

      3:将模式自动切换到IRQ模式,并将CPSR中的bit7位置1禁止后继IRQ中断的发生;

      4:跳转到相应的中断处理程序中执行

  中断处理程序一般保存中断现场,包括存在LR中的返回地址。在中断处理完毕后从栈中回复现场,并将LR的值给PC以返还到被中断的下一条指令。

  linux kernel中支持中断嵌套,即在中断处理程序中开中断,允许新的中断进来并处理。已有的中断处理程序在调用函数时会把返回地址放在IRQ模式的LR中,如果此时发生新的中断,新中断的返回地址也会被cpu自动放在IRQ模式的LR中,从而冲掉正在处理的中断函数调用返回地址导致错误。

  linux kernel中为了处理这种情况,进入中断处理程序后并在开中断允许中断嵌套之前,将处理其模式切换到svc模式,由于svc有自己独立的LR寄存器,函数调用是返回地址是放在svc模式的LR寄存器中不与IRQ模式的LR冲突,从而保证了中断嵌套的安全性。

  linux kernel中相关代码在arch/arm/kernel/entry-armv.S中

阅读(779) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~