Linux中断机制之三:中断的执行

在内核代码中,对X86平台中断执行的基本过程是:
1、 通过IDT中的中断描述符,调用common_interrupt;
2、 通过common_interrupt,调用do_IRQ,完成vector到irq_desc的转换,进入Generic interrupt layer(调用处理函数generic_handle_irq_desc);
3、 调用在中断初始化的时候,按照中断特性(level触发,edge触发等、simple等)初始化的irq_desc:: handle_irq,执行不同的通用处理接口,比如handle_simple_irq;
4、 这些通用处理接口会调用中断初始化的时候注册的外部中断处理函数;完成EOI等硬件相关操作;并完成中断处理的相关控制。

common_interrupt

按照之前CPU执行中断过程的描述,X86 CPU在准备好了中断执行环境后,会调用中断描述符定义的中断处理入口;根据中断相关初始化过程我们知道,对于用户自定义中断,中断处理入口都是(对系统预留的,就直接执行定义的接口了):

pushq_cfi $(~vector+0x80)
jmp 2f (执行jmp common_interrupt)

就是在把vector入栈后,执行common_interrupt&#

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【摘要】本文详解了 Linux 内核中断实现机制。首先介绍了中断的一些基本概念,然后分 析了面向对象的 Linux 中断的组织形式、三种主要数据结构及其之间的关系。随后介绍了 Linux 处理异常和中断的基本流程, 在此基础上分析了中断处理的详细流程, 包括保存现场、 中断处理、中断退出时的软中断执行中断返回时的进程切换等问题。最后介绍了中断相关 的 API,包括中断注册和释放、中断关闭和使能、如何编写中断 ISR、共享中断中断上下 文中断状态等。 【关键字】中断,异常,hw_interrupt_type,irq_desc_t,irqaction,asm_do_IRQ,软中断, 进程切换,中断注册释放 request_irq,free_irq,共享中断,可重入,中断上下文 1 中断概述 1.1 为什么需要中断? 处理器的速度跟外围硬件设备的速度往往不在一个数量级上,因此,如果内核采取让处理器 向硬件发出一个请求,然后专门等待回应的办法,显然差强人意。既然硬件的响应这么慢, 那么内核就应该在此期间处理其他事务,等到硬件真正完成了请求的操作之后,再回过头来 对它进行处理。想要实现这种功能,轮询(polling)可能会是一种解决办法。可以让内核定期 对设备的状态进行查询, 然后做出相应的处理。 不过这种方法很可能会让内核做不少无用功, 因为无论硬件设备是正在忙碌着完成任务还是已经大功告成,轮询总会周期性地重复执行。 更好的办法是由我们来提供一种机制,让硬件在需要的时候再向内核发出信号(变内核主动 为硬件主动)。这就是中断机制

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值