对中断的一点思考

深度思考与抗中断系统的构建与实践 深度思考是提升工作效率与创造力的关键,尤其在分布式系统架构和算法设计等复杂场景中。其核心在于保持思维的连贯性,避免频繁中断导致的认知重启能耗和灵感链断裂。通过物理隔离、思维快照技术和注意力锚点设计等方法,可以有效构建抗中断的思考系统。这些方法不仅适用于工程师和设计师,也能帮助任何需要高质量思考的职场人士。结合神经科学原理和实践工具链优化,持久思考能显著提升问题解决能力和创新产出。 阅读详情
对中断的一点思考
杨小华(normalnotebook@126.com)

    对于X86的单处理器机器,一般采用可编程中断控制器8259A做为中断控制电路。传统的PIC(Programmable Interrupt Controller)是由两片8259A风格的外部芯片以“级联”的方式连接在一起。每个芯片可处理多达8个不同的IRQ输入线。因为从PIC的INT输出线连接到主PIC的IRQ2引脚,所以可用IRQ线的个数限制为15,如图1所示。
 
图 1  8259A级联原理图(此图摘自《Linux内核完全注释》)
    “中断屏蔽寄存器”(Interrupt Mask Register,简称IMR)用于屏蔽8259A的中断信号输入,每一位对应一个输入。当IMR中的bit[i](0≤i≤7)位被置1时,相对应的中断信号输入线IRi上的中断信号将被8259A所屏蔽,也即IRi被禁止。
    当外设产生中断信号时(由低到高的跳变信号,80x86系统中的8259A是边缘触发的,Edge Triggered),中断信号被输入到“中断请求寄存器”(Interrupt Request Register,简称IRR),并同时看看IMR中的相应位是否已被设置。如果没有被设置,则IRR中的相应位被设置为1,表示外设产生一个中断请求,等待CPU服务。
然后,8259A的优先级仲裁部分从IRR中选出一个优先级最高中断请求。优先级仲裁之后,8259A就通过其INT引脚向CPU发出中断信号,以通知CPU有外设请求中断服务。CPU在其当前指令执行完后就通过他的INTA引脚给8259A发出中断应答信号,以告诉8259A,CPU已经检测到有中断信号产生。
    8259A在收到CPU的INTA信号后,将优先级最高的那个中断请求在ISR寄存器(In-Service Register,简称ISR)中对应的bit置1,表示该中断请求已得到CPU的服务,同时IRR寄存器中的相应位被清零重置。
    然后,CPU再向8259A发出一个INTA脉冲信号,8259A在收到CPU的第二个INTA信号后,将中断请求对应的中断向量放到数据总线上,以供CPU读取。CPU读到中断向量后,就可以装入执行相应的中断处理程序。
    如果8259A工作在AEOI(Auto End Of Interrupt,简称AEOI)模式下,则当他收到CPU的第二个INTA信号时,它就自动重置ISR寄存器中的相应位。否则,ISR寄存器中的相应位就一直保持为1,直到8259A显示地收到来自于CPU的EOI命令。
打住,各位看官读到这里,能回答如下问题吗?
1.    在执行中断处理程序时,中断一直是关闭着的吗?
2.    在执行中断处理程序时,本条中断线上的中断是否会被屏蔽?
3.    如果该条中断线被屏蔽了,那么是否一直要到该中断返回(即执行iter指令)时才开启?
4.    禁止中断后,异常还会执行吗?timer还会被执行吗?
    如果不能回答这些问题,请继续欣赏。如果你能回答,请关闭本文档,努力工作吧,或拿起一本英语书看看,这年头不好混,多看看英语吧 !:)
    当中断发生,CPU在穿越中断门时会关闭本处理器上所有的中断。此时中断执行路线是:common_interrupt->do_IRQ()->__do_IRQ()->handle_IRQ_event()->具体的中断处理程序。大家都知道中断类型包括三种:
标志 
含义
SA_INTERRUPT当该位被设置时,表明这是一个快速的中断处理程序。在本地处理器上,快速中断处理程序在禁止所有中断的情况下运行。除了时钟中断外,绝大多数中断都不使用该标志。
SA_SHIRQ 
该位表示中断可以在设备之间共享。
SA_SAMPLE_RANDOM
该位指出产生的中断能对/dev/random设备和/dev/urandom设备使用的熵池有贡献。

表 1中断类型标志位及其含义表
    如果相应的中断处理程序在注册时,即调用request_irq()函数进行中断处理程序注册时,会传递这三种中类型中的一个或数个。如果没有指定SA_INTERRUPT该类型。则在handle_IRQ_event()函数中会第一次开中断;如果指定了该参数,则会在关闭中断的情况下执行中断处理程序。
fastcall int handle_IRQ_event(unsigned int irq, struct pt_regs *regs,
                struct irqaction *action)
{
    int ret, retval = 0, status = 0;
    if (!(action->flags & SA_INTERRUPT))
        local_irq_enable();
   ……//调用中断处理程序
       local_irq_disable();
    return retval;
}
    如果此时开中断了,本条IRQ线上的中断也打开了吗?我要告诉你的是,在执行到这里的时候,本条线上的中断已经被屏蔽了,但也不是问题3中所说的一直到iret时才打开。
fastcall unsigned int __do_IRQ(unsigned int irq, struct pt_regs *regs)
{
    irq_desc_t *desc = irq_desc + irq;
    ……
    desc->handler->ack(irq);
    ……
    action_ret = handle_IRQ_event(irq, regs, desc->action);
    ……
    desc->handler->end(irq);
    ……
}
desc->handler->ack(irq);最终会调用mask_and_ack_8259A()(为什么会调用该函数,请查看源代码或相关书籍)。mask_and_ack_8259A的功能是:因为中断处理器在将中断请求“上报”到CPU后,期待CPU给它一个确认(ACK),也就是给8259A芯片一个应答信号,表示“我已经在处理”,应答时应该遵循这样的顺序:首先,屏蔽相应的IRQ;然后,发送EOI(End of Interrupt)命令。此外,如果IRQ来自于从8259A,还必须先向从 8259A发送EOI命令,再向主8259A发送EOI命令。如果IRQ来自于主 8259A,则仅仅向主8259A发送EOI命令就可以了。当一个中断服务结束后,CPU可利用中断结束命令EOI通知8259A,以便复位ISR中的相应位。因此当调用handle_IRQ_event()时,即使开中断,该条中断线的中断也是关闭的。一直到调用desc->handler->end(irq);时才清除中断屏蔽。
    细心的读者可能还有一个问题,为什么在handle_IRQ_event()返回时,还要关闭本地所有的中断(即代码中的local_irq_disable();)。因为在中断返回时,将会进行退栈清理性的工作,如果此时响应中断,鬼知道后果是什么?嘿嘿, Linus Torvalds肯定知道结果。因为他比鬼还厉害 :)
    虽然,中断关闭了,但异常并没有关闭。关中断只是关掉了外部中断,cli只是设置EFLAGS寄存器的IF位,如果该位被清除,则表示CPU会禁止外部中断传递信号给INTR引脚,但对于CPU内部异常和不可屏蔽中断(NMI)并不起作用。由于timer是外部中断,所以在禁中断后,timer中断将不在起作用,一直到开中断。

1.    如果在desc->handler->ack(irq);和desc->handler->end(irq);之间,该条中断线上再次发生中断,该中断是否会被丢失?
2.    在中断处理快结束时,会执行软中断。可在执行do_softirq()时,又会执行
if (in_interrupt())
        return;
    难道软中断不在中断中吗?岂不是执行到这里都返回了?
如果你又知道这些问题的答案,那我只能自认倒霉了,难道你就是传说中的hacker!!!:).
对于第一个问题,我也不能给出明确的答案。我只是把所收集的资料写出来。至于对不对,有大家自己去判断。
中断不会丢失,会被挂起(pending),保存在IPR(Interrupt Pending Register)中,等到中断允许位打开后再执行相应的中断处理程序。(但我查了8259A的寄存器,好像没有这个寄存器。)
    在《源代码情景分析》一书中p216第10行提到:“这样,就把本来可能发生在同一通道(甚至可能来自同一中断源)的中断嵌套化解为一个循环”。本人认为这种嵌套仅仅针对的是SMP的情况。因为对单CPU来说,ack操作已经将本条中断线给屏蔽了,根本不可能再响应了。
    如果哪位这里有比较好的权威性的答案,请记得发封邮件给我,先谢过了。
    在do_IRQ()中,将会调用irq_enter()()和irq_exit()两个函数。
fastcall unsigned int do_IRQ(struct pt_regs *regs)
{   
    ……
    irq_enter();
    ……
    __do_IRQ(irq, regs);
    ……
    irq_exit();
    ……
}
    在执行irq_enter()时,将会调用(preempt_count() += HARDIRQ_OFFSET);在执行irq_exit()函数时,又会:
void irq_exit(void)
{
    preempt_count()-= IRQ_EXIT_OFFSET;// # define IRQ_EXIT_OFFSET  HARDIRQ_OFFSET
    if (!in_interrupt() && local_softirq_pending())
        do_softirq();
    preempt_enable_no_resched();
}
    而in_interrupt()函数只是对preempt_count的某些位进行测试。所以在执行do_softirq()时,preempt_count经过一次加减运算后,将值还原了。所以只要不是中断嵌套的话,in_interrupt()会为假。所以执行到这里时,根本不会返回,除非中断嵌套。
    我们也该休息一下了,广告之后马上回来,进入下一个环节--有关调度的问题。
    我曾经在一个培训资料上看到如下的结论:
实时应用中,中断的发生不但要求迅速的中断服务,还要求迅速的调度有关的进程进入运行,在用户空间中对事件处理。 可是,如果这样的中断发生在内核时,本次中断返回是不会引起调度的,而要到最初使CPU从用户空间进入内核的那次系统调用或中断(或异常)返回时才会发生调度。倘若内核中的这段代码恰好需要较长时间来完成的话,或者连续又发生几次中断的话,就可能将调度过分的推迟。
    当中断发生在内核时,本次中断返回时是有可能引起调度的,原因是,只要need_resched被置位并且preempt_count=0,如果这这两个条件都满足,那么就会发生schedule()操作,
我认为写这段话的作者,当时可能研究的是2.4的内核,因为那时的内核是不可抢占的。当返回到用户态时,只需要对need_resched进行检查。
    另外一个问题:
    当idle运行时,发生外部中断A,中断处理程序A将一个进程P1唤醒,并设置了调度标志need_resched,在中断处理程序A还没有结束前,又有一高优先级的外部中断B发生,响应B,当中断处理程序B结束后,内核进行调度,选择中断A所唤醒的进程P1运行,此后,产生许多可运行的进程,致使idle不能很快再运行。这不就存在着很大的问题,甚者会导致该条线上的中断永远都不能响应。
    的确不错,当调用wake_up_process()时,如果被唤醒进程的优先级比当前进程的优先级高,那么将设置need_resched位。但这个问题忽略了一个很重要的问题,那就是中断B返回时,当返回内核态时(我想不可能返回到用户态吧),将会对need_resched和preempt_count进行检查,如果这两者都满足,才会进行调度。从上面分析可知,当发生中断嵌套时,preempt_count此时等于一个很大的值,虽然B在执行时,preempt_count经过一次加和减的操作,但A还是将该值设置成禁止抢占的,所以中断B返回时,根本不可能发生调度,而是会执行中断上下文A。


说明:有些结论来自论坛上网友的回答,向他们表示感谢。

友情鸣谢:
[1] www.linuxforum.net
[2] Daniel P.Bovel & Marco Cesati 《深入理解Linux内核》 中国电力出版社,2004
[3] 毛德操,胡希明  《Linux内核源代码情景分析》 浙江大学出版社,2001
[4] Robert Love 《Linux内核设计与实现》 机械工业出版社 ,2004

 
关于虚拟机中IPI中断的思考 其中,每个CPU的LAPIC接收到的中断是虚拟化的开销一个大头。外部中断源主要是IO设备,重度使用的IO设备比如有网卡,磁盘控制器等。目前,dpdk,spdk技术在虚拟化中的应用,已经把网络,存储中断减少到了0。内部中断源包括时钟,性能监控,错误检测,温度传感器。这几个中断,绝大多数日常使用虚拟机情况下发生频率极低。对虚拟化的开销影响很小。IPI中断是多核CPU系统中CPU彼此通信的唯一方法。主要使用在分布在不同CPU上的进程/线程彼此唤醒的情况中。 阅读详情

相关推荐

【单片机原理及应用】实验:数码管的中断控制

IT0: 外部中断0的触发方式(1表示下降沿触发),IT1: 外部中断1的触发方式(1表示下降沿触发),EX0: 允许外部中断0,EX1: 允许外部中断1,EA: 全局中断允许。通过实验,我可以将理论知识与实际操作相结合,更好地理解和掌握知识,实验还培养了我的动手能力、思考能力和解决问题的能力,加深了对C51编程和Proteus x8软件的理解,还学会了如何运用理论知识解决实际问题,通过反复调试和网上查阅相关资料,最终解决了问题,实现了目标。达到F后重新从1开始,如下图所示,LED上面的值显示为1。

m0_73970214的博客 4826

进程一二事

进程简单介绍

wctzhong的博客 725

Cortex-M4板子 UART中断实验思考

实验任务:1. PC 端发来绝对对时命令,如 SET12:56:03 或 12-56-03,自动将当前时间同步到12:56:03,并回之以当前时间解决方式:利用UARTHANDLER即UART中断实现非阻塞性赋值遇到问题与解决过程:1. 输出时间为乱码首先确认时间显示代码段正确 if (light_cnt == 60) { light_cnt = 0; if (light_cnt1 == 6...

tangnanshen的博客 1857

单片机之中断

 最近,学习了单片机的一些知识,今天我想说说中断,所谓中断其实就是指单片机由于收到某个请求而停止手头上的事情转而去处理这个请求,最后再继续执行自己手头上的事情。那这个过程是怎样的呢? 第一步,主程序即单片机正在执行的程序在接受到请求后,将自己正在执行的指令完成。(与堆栈相对应的就有堆栈寄存器,存放指向堆栈的地址)。 第二步,接下来将下一条指令的地址送到堆栈中保存起来,我们将这称之为中断响应。 第三...

xiaoxiaoyu 1658

有关中断唤醒源的思考

各位大佬好,如下是关于中断唤醒系统的一个流程上的总结,由于这方面知识过于复杂,又牵扯到SOC厂商的设计,而且我也没有做过这方面工作,所以一半来自文档一半靠猜测,都不一定对,反正自己给自己解释得通了。希望大佬们不小心刷到了本文,如果觉得是合理的,给个赞,如果看出明显的错误,也帮忙指出下,不胜感激,多谢! 当一个蓝牙中断(如NS group 1中断)做为唤醒源产生中断时,此时的流程应当是这样的: Redistribute发生一个Wake Request给Power controller,Power contr

baron-周贺贺-代码改变世界ctw 900

【各种轮子2】基于Icepak的PCB散热仿真比较

随着电子产品的集成度越来越高,PCB板的尺寸越来越小,板级芯片散热的问题越来越成为电子工程师的一个重要挑战。对于板级芯片散热,主要依靠工程师对PCB自身的设计进行优化,同时要兼顾系统的尺寸和成本。本文分别从芯片角度和PCB角度进行建模,芯片模型选用QFN封装,PCB模型采用走线导入模型,探讨了芯片结构,PCB铜厚,PCB叠层厚度对芯片散热的影响。

3671

I/O

输入/输出     I/O设备分类:块设备,字符设备。     块设备:每个块都独立于其它块而读写。把信息存储在固定大小的块中,每个块都有自己的固定地址。通常512-32768     时钟既不产生或接收字符流,也不是块可寻址的。     I/O设备一般由机械不见和电子部件组成。电子部件叫设备控制器或适配器。控制器卡上通常有一个连接器,通向设备     本身的电缆可以插入到这个连接器中。

jinya 889

嵌入式开发之瑞芯微RK356x--基本环境搭建

嵌入式环境搭建

NexyHO的博客 618

关于handle_level_irq、handle_edge_irq和中断嵌套问题

在中断的响应和服务的博文中,我们提到了handle_level_irq,但是忽略了另一个和他对应的函数handle_edge_irq。现在我们需要单独地对他们分析一下,并借此来分析有关Linux中断嵌套的问题! 在说这两个函数之前,我们有必要先了解电平触发和边缘触发,及他们之间的区别。可以参考博文http://blog.youkuaiyun.com/sunnybeike/article/details/69

SunnyBeiKe的专栏 6574

2024年CSP-X复赛真题题解(T1:购物)

2024年CSP-X复赛真题题解(T1:购物)

王老师青少年编程 1182

【脑肿瘤分类与迁移学习技术】Swin UNETR:当 Swin Transformer 遇见 3D 医学图像分割——从黑盒到白盒的逐层拆解

医学图像分割的终极目标是让算法成为医生的可靠副手,而非黑箱替代品。理解 Swin UNETR 的每一层如何流动、每一个窗口如何移位、每一次拼接如何融合,不仅是为了调参,更是为了在临床场景中。

u012133341的博客 55

关于线程中断的一点思考和探究

起因: 项目引入了sonar代码检测工具,检测出代码中关于InterruptException异常的处理存在问题 项目中相关代码如下: public void demo() { RLock rLock = redissonClient.getLock(key); boolean tryLock = false; try { t...

雪落南城的博客 557

【数据集总结】不透水面积ISA:GAIA、CLUD-Urban、GISA

【数据集总结】不透水面积ISA:GAIA、CLUD-Urban、GISA

WW、forever的博客 2160

Cortex-M3的PendSV中断以及uCOS系统一点思考

uCOS中 OSStart函数     | OSStartHighRdy函数 会重新设置PendSV中断的优先级,把该中断优先级设置为最低 每次时钟中断时(一般为最高优先级),查看是否要进程切换。 如果此时有中断嵌套则不进行进程切换,防止破坏进程的空间 有些Moto的处理器支持中断处理函数使用指定的栈。 对于Cortex-M3架构来说

YUAN1125的专栏 7543

uniapp [全端兼容] - 实现内网使用天地图离线地图,详解项目加载天地图的离线地图服务器部署与使用教程示例源码,Uniapp如何实现天地图的离线加载部署在内网访问(兼容H5、微信小程序、App)

uniapp天地图如何离线访问,无需网络调用天地图API,天地图离线地图,天地图——内网使用离线地图,uniapp中加载天地图的离线地图,uniAPP实现天地图离线访问,在内网中无法直接使用外网天地图资源怎么办,在uni-app中加载地图 -使用天地图的瓦片数据。UNIAPP天地图离线怎么使用,内网部署天地图,天地图离线瓦片,部分瓦片数据,天地图如何离线,下载天地图离线服务,并用Uniapp+天地图离线部署,天地图私有化部署,实现离线加载天地图,Java+uniapp天地图离线开发,uniapp项目中无网络

🏆 前端领域优质创作者 4908

Taro React组件使用(5) —— RuiPasswordInput 密码输入框显示隐藏和清空

初始化时,需要将传入的 value 赋值给当前组件的 value, 不能直接修改 props 的 value;在组件内输出组件内的变量时,最好先判断输出函数是否定义,再输出,否则很容易引起报错。

止于至善 891

esp8266 at接收数据中断时间_关于嵌入式系统中断优先级的一点思考

最近在做一个agv的控制板开发时发现,中断优先级的不同设置方式会对接收的数据产生影响。思考了一阵后发现会不会是接收数据超时导致接收到的数据出现错误,所以就有了以下思考。由于我们用的串口比特率偏高,导致接收一个byte的超时时间应该是比较短的。下面假设串口传输没有使用奇偶校检位,发送一个byte相当于10个bit(1位起始位+8个数据位+1位结束位)的情况。| Baudrate | ...

weixin_29367131的博客 321

Mac安装Typescript报错

根本原因是系统级目录的权限限制。推荐通过修改目录权限或使用nvm彻底解决问题。

江拥羡橙的博客 210

中断频率的思考

对于单片机定时器的一点思考 首先要计算出计数器加1的时间 比如说1Mhz,每秒钟运行10的6次方 加一的时间为10的-6次方即1微秒, 其次是定时器计数多少次发生中断,比如说5000次 那发生一次中断时间为5毫秒 中断频率为1/0.005=200hz ...

qq_42188312的博客 2219

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

关于Linux中断一些思考

目录 前言 关于中断历史与发展 Linux中断设计 Linux中断下半部实现 软中断: Tasklet: 工作队列: 关于可重入和不可重入函数 前言 在我们学习中断的时候,先要了解几个概念。何为中断?为什么要使用中断?中断如何运作?弄明白这些再去使用中断会显得得心应手。 何为中断?CPU在运行的过程中,由于外部因素,终止执行当前的任务去执行另一个任务。打个比方,你在做一个任务,突然上司来一个优先级更高的任务让你去完成,这时候你就要放下当前的任务而去执行优先级比较高的紧急任务。 为什么

ctgulvzhaole的博客 914

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

x86保护模式的几点思考——IRQ、中断号和中断向量

说到中断号和中断向量,也许你并不陌生,这两个概念也可以将中断原理解释个大概了。但是当你深究下去的时候你会碰到另一个东西——IRQ,之后自然而然的对从硬件级开始到中断向量表的整个中断过程产生好奇,然后继续研究,就能学到下文中所包含的内容了。      你没有硬件基础?我也没有!所以让咱们从零开始。      IRQ(Interrupt ReQuest),中文翻译应该为“中断请求”,但实际上一些文

求索 8287

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

关于中断的一点点认识

前一段时间,有幸和都江堰操作的作者面对面的聊了一把。对于前辈的技术和才能,晚辈深深地佩服。DJY_OS在应用方面的事件机制以及处理中断的方法都让人眼前一亮。在谈到中断时,前辈说,很多人都没有真正的理解中断。于是我就请教了前辈。他说: “http://www.djyos.com/bbs/forum.php?mod=viewthread&tid=6082&extra=page%3D11、  中断是异步

雪松's RTEMS 4574

关于Spinlock机制的一点思考

Spin_lock的kernel中的实现对单核(UP),多核(SMP)有不同的处理方式。在这之前经常搞混,重新理一理。 对单核来说,如果spin_lock不处于中断上下文,则spin_lock锁定的代码丢失CPU拥有权,只会在内核抢占的时候发生。所以,对于单核来说 ,只需要在spin_lock获得锁的时候禁止抢占,释放锁的时候开放抢占。其实这不是真正意义上的锁。对多核来说,存在两段代码

技术无捷径,一步一脚印 3704

java 硬件中断_中断、异常结合Java异常机制的思考

一、计算机中的中断和异常中断又称为硬件中断,是由硬件设备产生的操作系统的异常是由 操作系统执行某些指令而产生的,这些异常又分为硬件异常和软件异常1.1 硬件异常:Windows 识别的硬件异常在下表中进行了汇总:表 1异常代码异常的原因STATUS_ACCESS_VIOLATION 读取或写入不可访问的内存位置。STATUS_BREAKPOINT 遇到硬件定义的断点;仅由调试器使用。STATUS_...

weixin_33626609的博客 375
上一篇: [转载]优秀中层必备的十大能力
下一篇: 我的专题文章之二----对中断的总结
normalnotebook
博客等级 码龄24年 647粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值