为什么中断处理函数内不能休眠

为什么在中断上下文中不能休眠 为什么在中断上下文中不能休眠 我的理解: 1.执行在中断上下文的代码: a)中断的 top half (interrupt handler)和 b)bottom half(softirq,tasklet等) 2.中断服务程序需要满足的特性: 需要记住 interrupt handler 在执行时是中断了其他的进程或者其他的interrupt handler的。对于inter 阅读详情

假设你有一段代码用于休眠

int count = 0x00FFFFFF;
while(count--);

情况一.中断处理前半段的休眠

1.内核在此处是关中断执行的,所以任何的可屏蔽中断都得不到响应.
缺页异常??CPU一直在你的while里正常执行,所以缺页异常是不存在的,因为没有触发的条件
除0异常??CPU一直在你的while里正常执行,哪来的除0异常,也是没有触发的条件
调度??CPU一直在你的while里正常执行,怎么能去执行其他地址的指令而产生调度
想想有什么异常可以导致CPU重新跳转到新的指令地址去执行??

2.除非有一个硬件外设可以突发产生一个不可屏蔽中断,并且优先级比你正在执行的中断高.
假设这种情况真的产生了,CPU的确跳转到这个新的中断处理函数去执行,但因为这次中断的产生是在内核中的,所以堆栈并不发生切换,使用的仍然是内核堆栈.在这个中断返回以后,仍然回到你的这段休眠代码,最终等这个while循环结束以后,你的中断返回了,才会继续到其他地址执行(中断进入前的地址)

3.如果你的休眠是while(1);那除了上述2可以得到CPU执行外,内存中其他所有指令都得不到执行.内核挂掉了.

情况二.中断处理后半段的休眠(bh)

1.内核在此处是开中断执行的,所有任何中断和异常都可以打断这段代码的执行,但执行的情况跟上述情况一的2类似.

2.如果你的休眠是while(1);那除了所有中断可以得到CPU执行外,内存中其他所有指令都得不到执行.内核除中断和异常处理外都挂掉了,应用层也挂掉了.

2018.03.16 - 为什么中断处理函数中不能出现阻塞 1、 中断处理的时候,不应该发生进程切换,因为在中断context中,唯一能打断当前中断handler的只有更高优先级的中断,它不会被进程打断,如果在 中断context中休眠,则没有办法唤醒它,因为所有的wake_up_xxx都是针对某个进程而言的,而在中断context中,没有进程的概念,没 有一个task_struct(这点对于softirq和tasklet一样),因此真的休眠了,比如调用了... 阅读详情

相关推荐

内存学习(3):DRAM的基础存储结构(存储层级、读写过程,刷新与暂存)

DRAM,全称为 Dynamic Random Access Memory ,中文名是“动态随机存取存储器”。所谓“动态”是和“静态”相对应的,芯片世界里还有一种 SRAM 静态随机存取存储器的存在。笼统地说,DRAM 的结构比 SRAM 更简单,面积占用更小,适合制作大容量的存储芯片;而 SRAM 结构复杂一些,一般使用六个晶体管,面积消耗大,但是读写速度快,而且因为 SRAM 只用到晶体管,所以在工艺上和逻辑芯片相兼容,我们可以在逻辑芯片上直接集成 SRAM。

呆呆象呆呆的博客 2万+

为什么中断里不能 sleep

为什么在 Linux 的 ISR 里,不能 call scheduler?

lyndon 1637

vue 获取el-table多选的选中行

<el-table :data='tableData' ref="multipleTable" v-loading='loading' border max-height='700' style='width: 100%' size="mini"> <el-table-column type="selection" width="55"></el-table-column> <el-table-column label

且听风吟的博客 6649

中断中不能睡眠的原因

这个说起来有点多,一一来看: 1,中断要根据前后文来说,一般说中断上下文中不能睡眠,这个中断是指硬件事件发生,触发CPU停止当前活动转而去处理硬件请求. 2,根据硬件请求响应处理逻辑的实时紧要与否,将整个中断处理过程分为上半部和下半部. 3,上半部也就是所谓的硬中断处理逻辑,其要求cpu在收到硬件请求后必须马上处理的事情,比如网卡收到数据包了,把数据包从网卡缓存拷贝到主存(可以由DMA完成,

one shot,one kill. 4123

保姆级教程:用Docker快速部署mpromonet/webrtc-streamer实现WebRTC直播(附常见问题解决)

本文提供了一份详细的Docker部署mpromonet/webrtc-streamer的实战指南,帮助用户快速搭建WebRTC直播服务。内容涵盖从环境准备、基础部署到进阶配置与性能调优的全过程,并针对容器网络、视频流配置、跨网访问等常见问题提供了解决方案,旨在实现低延迟的流媒体传输。

dell8的博客 177

大型我的世界RPG服务器开服全攻略:从环境配置到插件部署

搭建一个能支撑百人稳定在线的我的世界服务器,远不止选择服务端和安装插件那么简单。服务器架设涉及硬件选型、Java环境、端口放行、启动脚本与systemd守护等基础环节,而大型RPG玩法还依赖MythicMobs、Quests、LuckPerms等插件协同工作。理解这些技术组件的原理与配置逻辑,是确保长线运营的关键。对于希望打造原创剧情、职业副本和自定义Boss的团队而言,合理规划MySQL数据库、RCON批量管理及性能调优,能显著降低后期维护成本。本文围绕RPG服务器核心能力,从环境准备到插件部署,再到常见

weixin_27230891的博客 370

中断不能睡眠的原因

转载地址原文地址 这个说起来有点多,一一来看: 1,中断要根据前后文来说,一般说中断上下文中不能睡眠,这个中断是指硬件事件发生,触发CPU停止当前活动转而去处理硬件请求. 2,根据硬件请求响应处理逻辑的实时紧要与否,将整个中断处理过程分为上半部和下半部. 3,上半部也就是所谓的硬中断处理逻辑,其要求cpu在收到硬件请求后必须马上处理的事情,比如网卡收到数据包了,把数据包从网卡缓存拷贝到主存(可以由DMA完成,但寄存器的修改以及资源设定还是要由cpu去做)的逻辑就需要cpu立即去做,不做的话,网络新来的数据包

afootball的博客 1312

嵌入式系统启动流程解析:ROM Code、Bootloader与启动代码的协同工作

本文深入解析嵌入式系统从通电到运行的完整启动流程,详细阐述了ROM Code、Bootloader与启动代码三者如何像接力赛般协同工作。ROM Code作为芯片固化的初始引导程序,负责硬件自检并加载Bootloader;Bootloader作为系统总指挥,初始化关键硬件并加载操作系统内核;启动代码则为C语言运行环境铺平道路。理解这三者的分工与协作,是进行系统移植和解决启动问题的关键。

dd012的博客 553

为什么中断上下文不能休眠

这是早该知道的问题 1. 中断处理的时候,不应该发生进程切换,因为在中断context中,唯一能打断当前中断handler的只有更高优先级的中断,它不会被进程打断(这点对 于softirq,tasklet也一样,因此这些bottom half也不能休眠),如果在中断context中休眠,则没有办法唤醒它,因为所有的 wake_up_xxx都是针对某个进程而言的,而在中断context中,没有进程的

Yasin Lee 1568

联想ThinkPad声卡驱动安装避坑指南:从E470到X1 Carbon的通用解法

本文详细介绍了ThinkPad声卡驱动安装的全流程,从硬件识别到驱动获取、安装技巧及深度排错。涵盖E470到X1 Carbon等不同机型的通用解法,帮助用户解决音频驱动问题,提升使用体验。重点讲解了声音驱动的精准识别和安装策略,确保系统稳定运行。

weixin_29207439的博客 708

robosuite 入门教程(一)安装与基本用法

摘要:Robosuite是基于MuJoCo的模块化机器人仿真框架,提供标准化基准测试环境和多样化机器人控制功能。作为ARISE计划的一部分,该框架支持强化学习、模仿学习等算法研究,包含程序化环境生成、多模态传感器、多种控制器及遥操作设备。支持macOS/Linux系统,提供详细安装指南和功能演示脚本,包括随机动作测试、控制器验证、域随机化等。最新版本v1.5新增人形机器人支持、全身控制器和照片级渲染功能,旨在降低机器人学习研究门槛,促进算法开发与评估。

2506_90492529的博客 1267

为什么在中断上下文中不能休眠?

1.中断处理的时候,不应该发生进程切换,因为在中断context中,唯一能打断当前中断handler的只有更高优先级的中断,它不会被进程打断(这点对于softirq,tasklet也一样,因此这些bottom half也不能休眠),如果在中断context中休眠,则没有办法唤醒它,因为所有的wake_up_xxx都是针对某个进程而言的,而在中断context中,没有进程的概念,没有一个task_s

jingyilin2008的专栏 772

人像美肤 人体美型 CVPR 2022 ABPN

人像美肤 CVPR 2022 ABPN

jacke121的专栏 841

Linux mdelay与msleep的区别以及中断中不能休眠的原因

在linux driver开发中,经常要用到延迟函数:msleep,mdelay. 虽然msleep和mdelay都有延迟的作用,但他们是有区别的: mdelay是忙等待函数,在延迟过程中CPU无法运行其他任务。最好用于短时间的延时,否则太浪费CPU资源。 msleep会使当前进程进入休眠状态,CPU可以去执行其他任务。由于msleep涉及到进程调度,延时误差比较大 (进程调度需要耗费时间

rexling1的专栏 2847

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

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

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

为什么中断不能睡眠

这个问题有很多人问过,我看了下Linux得内核代码,原因如下:(当然我不能保证一定对,如果有牛人理解得更好,欢迎指正) 1、 中断处理的时候,不应该发生进程切换,因为在中断context中,唯一能打断当前中断handler的只有更高优先级的中断,它不会被进程打断,如果在 中断context中休眠,则没有办法唤醒它,因为所有的wake_up_xxx都是针对某个进程而言的,而在中断context

linux-混混 8279

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

中断处理程序中不能出现睡眠代码的原因

由于异常为同步事件,由当前进程执行所引发,所以可以说,异常处于被打断进程的上下文之中,为当前被打断的进程服务,所以在异常处理过程中,可以调用任何内核态的函数,也可以睡眠。因为睡眠时(应为是)有意义的,同时也是合理的;而中断为异步事件,虽然使用当前被打断进程的内核栈、处于被打断进程的上下文之中,但是和当前被中断进程没有必然的关系,同时中断处理程序和外部的一个具体设备相对应,这就要求中断处理程序能快速

做一个有技术追求的人 4022

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

20260110 - Linux 驱动开发学习笔记:上下文、中断与休眠

要理解为什么不能在中断处理函数中里调用休眠函数让出CPU,首先必须搞清楚。

qq_50932511的博客 1047

linux kernel 中断处理函数里不能进程调度的原因

 这里就行了很深入的讨论,值得一看: http://bbs2.chinaunix.net/viewthread.php?tid=1618430 但是,他们的讨论最后没有得出一个明确的结论。其中, cskyrain在8楼 的思考触及到了一个要点,但是没有深入展开: 1楼 发表于 2009-11-24 20:36  | 只看该作者   一直认为中断处理函数不能休眠的是天经地义的,可从没

欧阳海宾 2645

Linux中断上下文中为什么不能休眠

2.schedule()在切换进程时,保存当前的进程上下文(CPU寄存器的值、进程的状态以及堆栈中的内容),以便以后恢复此进程运行。中断发生后,内核会先保存当前被中断的进程上下文(在调用中断处理程序后恢复); 但在中断处理程序里,CPU寄存器的值肯定已经变化了吧(最重要的程序计数器PC、堆栈SP等),如果此时因为睡眠或阻塞操作调用了schedule(),则保存的进程上下文就不是当前的进程cont...

Mr.W的博客 1126

为什么中断处理函数不能添加sleep()函数?

中断处理的时候,不应该发生进程切换,因为在中断上下文中,唯一能打断当前中断处理函数handler的只有更高优先级的中断,它不会被进程打断(这点对于softirq,tasklet也一样,因此这些bottom half也不能休眠),如果在中断上下文中休眠,则没有办法唤醒它,因为所有的wake_up_xxx都是针对某个进程而言的,而在中断上下文中,没有进程的概念,没有相应的task_struct(这点对...

Tim的嵌入式之旅 3300

为什么中断不能休眠

1. 中断处理的时候,不应该发生进程切换,因为在中断context中,唯一能打断当前中断handler的只有更高优先级的中断,它不会被进程打断(这点对 于softirq,tasklet也一样,因此这些bottom half也不能休眠),如果在中断context中休眠,则没有办法唤醒它,因为所有的 wake_up_xxx都是针对某个进程而言的,而在中断context中,没有进程的概念,没有一个tas

xiaoshengqdlg的专栏 634

为什么中断处理函数中不能出现阻塞

1、 中断处理的时候,不应该发生进程切换,因为在中断context中,唯一能打断当前中断handler的只有更高优先级的中断,它不会被进程打断,如果在中断context中休眠,则没有办法唤醒它,因为所有的wake_up_xxx都是针对某个进程而言的,而在中断context中,没有进程的概念,没有一个task_struct(这点对于softirq和tasklet一样),因此真的休眠了,比如调用了会导...

QtHalcon 3964

为什么中断上下文不可以休眠

先把中断处理流程给出来 1.进入中断处理程序--->2.保存关键上下文---->3.开中断(sti指令)--->4.进入中断处理程序的handler--->5.关中断(cli指令)---->6.写EOI寄存器(表示中断处理完成)---->7.开中断。 复制代码 硬中断: 对应于上图的1、2、3步骤,在这几个步骤中,所有中断是被屏蔽的,如果在这个时候睡眠了,操作系统不

BPC's Domain 1609

【转载】为什么中断不能休眠

中断处理的时候,不应该发生进程切换,因为在中断context中,唯一能打断当前中断handler的只有更高优先级的中断,它不会被进程打断(这点对 于softirq,tasklet也一样,因此这些bottom half也不能休眠),如果在中断context中休眠,则没有办法唤醒它,因为所有的 wake_up_xxx都是针对某个进程而言的,而在中断context中,没有进程的概念,没有一个task_...

wang 恒 的博客 806
上一篇: 调度--操作系统的欺骗
LastEditor
博客等级 码龄18年 2粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值