免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2086 | 回复: 5

[中断] (linux2.6内核)中断程序中不能进行调度疑惑 [复制链接]

论坛徽章:
0
发表于 2015-07-02 22:16 |显示全部楼层
网上有好多这方面的解答,都没咋看懂,发帖子请教各位大神
前提:
2.6内核中,有个中断栈的概念,一个cpu有两个中断栈,也就是说假设进程A发生中断,中断程序就会在指定的中断栈中运行,A与此中断的栈是独立分开的
问题(我理解的步骤):
1.A发生中断,current指向当前进程A
2.中断函数执行,此时在新的栈中执行, current此时指向A
3.任务调度,此时cpu保存硬件上下文(也就是当前中断上下文)至current指向的thread_info中,即A中,然后执行schule()函数切换到别的任务,
4.切换回任务A中
请教大家这样的话就算是有独立的中断栈,在中断中进行调度任务的话,当前硬件的ss,eip会自动被保存到current所指向的进程中,那么下回不也能在切换回来继续执行吗?

论坛徽章:
13
程序设计版块每日发帖之星
日期:2016-06-29 06:20:00每日论坛发贴之星
日期:2016-08-14 06:20:00操作系统版块每日发帖之星
日期:2016-08-14 06:20:00每日论坛发贴之星
日期:2016-08-13 06:20:00数据库技术版块每日发帖之星
日期:2016-08-13 06:20:00程序设计版块每日发帖之星
日期:2016-08-13 06:20:00IT运维版块每日发帖之星
日期:2016-08-13 06:20:00每日论坛发贴之星
日期:2016-08-12 06:20:00数据库技术版块每日发帖之星
日期:2016-08-12 06:20:00程序设计版块每日发帖之星
日期:2016-08-12 06:20:00操作系统版块每日发帖之星
日期:2016-08-12 06:20:00综合交流区版块每日发帖之星
日期:2016-08-09 06:20:00
发表于 2015-07-17 20:49 |显示全部楼层
本帖最后由 karma303 于 2015-07-17 20:50 编辑

  Hi,中断处理程序中不能调用schedule,这是早期unix设计时的一个简化。
  中断例程可以“软性”的做schedule,像这样:
  current->need_sched = 1
  这样,当中断例程结束,返回用户空间前夕,内核会检测一下need_sched字段,做schedule的。(这时候中断处理流程已经结束了)。

  上面一段话,是我对你题目的理解。你是想说这吧?
  帖子的最后一段话没有看懂,没法回复。  state it another way.

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
发表于 2015-07-20 18:23 |显示全部楼层
猜测楼主是想问,为什么不能在中断上下文调度?
或者是,~假如~在中断上下文发生了调度,由于irq stack的esp被保存了,信息是完整的,是否就可以被调度回来?

这肯定是不行的,因为irq stack是per cpu的,不是per process的,新调度的进程B如果发生了中断,将覆盖进程A的irq stack。
PS,无irq-stack的场景呢?

论坛徽章:
0
发表于 2015-08-05 14:02 |显示全部楼层
nswcfd 发表于 2015-07-20 18:23
猜测楼主是想问,为什么不能在中断上下文调度?
或者是,~假如~在中断上下文发生了调度,由于irq stack的e ...

谢谢回复 ,恍然大悟,如果B进程发生 ①中断用了irq_stack,②之后进行调度,③之后运行进程A,④进程A又发生中断用了irq_stack(覆盖了进程B的irq_stack), ⑤这样进程B的环境遭到了破坏,⑥.这时假设进程B又被切换回来运行,会继续运行之前irq_stack所在的位置,但irq_stack所保存的如何回去B进程的信息不复存在. 我理解的对吗?

-------------------------------------------------------------------------------------------------------------------------------------------
之前我不理解网上说 :若进程A运行,产生中断后,在中断中进行调度的话,是没法再切换回A中继续运行. 我认为可以,因为不管是进程栈还是中断栈, 在任务调度的时候,都会把当前cpu的上下文存起来的
比如进程A---->发生中断---->中断中睡眠( 会把当前寄存器的值 ss sp eip..存入全局变量current中 ,虽然存入的ss,sp 是属于独立中断栈,但会存到进程A的current中),所以之后理论上是可以再切换回来的  

论坛徽章:
0
发表于 2015-08-05 14:07 |显示全部楼层
karma303 发表于 2015-07-17 20:49
Hi,中断处理程序中不能调用schedule,这是早期unix设计时的一个简化。
  中断例程可以“软性”的做sche ...

谢谢回复 ,我的意思是想说进程发生中断,在中断中进行睡眠或调度(schedule),那么此进程还是会被调度回来的,因为假设A进程在运行,current指向的是A,A发生中断,若在中断中睡眠(此时current指向的还是A), 睡眠前会把此时cpu的上下文存入current中(即A中)(虽然此时的上下文输入per cpu)

论坛徽章:
0
发表于 2015-08-05 14:08 |显示全部楼层
发现自己的想象力不够啊'(
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP