中断 异常 软中断

CPU 提供了两种中断程序执行的机制,中断和异常。(硬中断)

中断:异步事件,通常是外部IO设备

异常:同步事件,CPU执行指令时检测到的反常条件,如除法异常、错误指令异常,缺页异常等。

中断机制的最终目的,都是让 CPU 收到一个中断号

中断通过可编程中断控制器,外部设备给可编程中断控制器IRQ引脚线发送信号,由于可编程中断控制器提前被设置好了 IRQ 与中断号的对应关系,所以就转化成了对应的中断号,把这个中断号存储在自己的一个端口上,中断控制器再给CPU的INTR引脚发送信号CPU 收到 INTR 引脚信号后去前面存储中断号的那个端口读取中断号。

异常的机制更简单,CPU 自己执行指令时检测到反常情况后自己给自己一个中断号即可。

INT n 叫做软件中断,因为他是由软件程序主动触发的。相应的把上面的中断和异常叫做硬件中断

中断描述符(保护模式)=中断向量(实模式):中断号对应的中断服务程序的地址的段选择子段内偏移地址。然后段选择子又会去全局描述符表中寻找段描述符,从中取出段基址。之后段基址 + 段内偏移地址,才是最终处理程序的入口地址。

所以中断描述符相当于是中断号和中断服务程序的对应。

中断描述符具体可以分为三类:Task Gate:任务门描述符、Interrupt Gate:中断门描述符、Trap Gate:陷阱门描述符  任务门描述符Linux中几乎没有使用,中断门不允许中断嵌套,陷阱门允许中断嵌套。(实际应用中,由于多队列网卡(一个网卡不再仅仅产生一种中断了,可能多达数十个!)会导致中断栈溢出,故于2010年终于关闭硬中断嵌套机制了)

CPU 收到一个中断号 n 后,会去中断向量表中寻找第 n 个中断描述符,从中断描述符中找到中断处理程序的地址,然后跳过去执行(跳过去前要压栈保护上下文)

上面的硬中断是纯硬件实现的逻辑,而软中断(softirq)是纯软件实现的

硬中断的微观层面,就是 CPU 在每一个指令周期的最后,都会留一个 CPU 周期去查看是否有中断,如果有,就把中断号取出,去中断向量表中寻找中断处理程序,然后跳过去。

软中断(softirq)的微观层面,简单说就是有一个单独的守护进程,不断轮询一组标志位,如果哪个标志位置位了,就去这个标志位对应的软中断向量表中找到软中断处理函数,然后跳过去。

所以想要触发软中断,只要把这里的对应的标志位置1即可。

软中断处理流程,软中断执行过程中用户程序无法执行,但是可以被硬中断打断。

为了满足实时系统的要求,且硬中断资源非常宝贵,如果占着硬中断函数不返回,会影响到其他硬中断的相应速度,如点击鼠标等。硬中断得尽快返回,所以会把耗时操作放在中断下半部。

软中断是 Linux 实现中断的下半部的一种非常常见的方式。

这个中断下半部执行过程中可以被新的硬中断打断,执行硬中断的上半部后再返回。中断下半部会遍历所有的中断的下半部,查询是否需要执行。

tasklet(tasklet_softirq): 软中断的一种,专门用于实现中断下半部,用于耗时较长但可以接收的范围,如果耗时过长则需要线程化,两种办法:工作队列threaded_irq

工作队列worker内核线程:创建一个work,设置work执行的函数work.func,中断上半部执行结束后把work加入work_queue,内核等机会合适时运行这个work线程。但这样的worker线程只能运行在一个CPU上。也就是说这里所有中断的下半部执行线程都在同一个CPU上。

request_threaded_irq:为每个中断创建一个线程,在执行完上半部后会唤醒下半部的线程,因为是独立的线程,所以可以随机执行在任意CPU上。

参考文献:

认认真真的聊聊中断 (qq.com)

Linux内核中的软中断、tasklet和工作队列详解-CSDN博客

5_19-2.Linux系统对中断处理的演进_哔哩哔哩_bilibili

【Linux内核】Linux软中断处理机制-ksoftirqd-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值