免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: cskyrain
打印 上一主题 下一主题

中断处理程序为什么不能阻塞休眠???以前真没认真思考过! [复制链接]

论坛徽章:
0
21 [报告]
发表于 2009-11-25 11:11 |只看该作者
个人理解如下,请高手指正:
1、如果ISR被阻塞了,相同类型的中断在ISR返回前不能被处理;
2、因为中断会保存寄存器数据到current的内核栈,然后执行ISR,当ISR被阻塞后并在唤醒前,current再次被调度器调度的话,内核栈保存的数据就乱掉了;
3、可能还有其他原因,暂时没想到。。。

论坛徽章:
0
22 [报告]
发表于 2009-11-25 11:27 |只看该作者

回复 #21 fox144215 的帖子

没看懂你的解释,内核栈保存的数据咋就乱掉了

论坛徽章:
0
23 [报告]
发表于 2009-11-25 11:59 |只看该作者

回复 #22 cskyrain 的帖子

21的解释确实看不懂……

另外,就算按照目前的内核实现内核栈有可能会乱掉(比如中断上下文的栈与进程的内核栈分开了),也肯定有办法让它不乱掉。
我觉得,中断上下文里面block,应该是可以做到的。 但是问题不是能不能做,而是该不该做……

论坛徽章:
0
24 [报告]
发表于 2009-11-25 12:44 |只看该作者

论坛徽章:
0
25 [报告]
发表于 2009-11-25 13:06 |只看该作者
这个很简单,current在返回用户空间时会弹出保存在内核栈的寄存器数据,但是栈顶的数据是中断保存的,而不是current从用户空间进入内核空间时保存的那部分数据了。

论坛徽章:
0
26 [报告]
发表于 2009-11-25 13:15 |只看该作者

回复 #25 fox144215 的帖子

  确实很简单……
按你的讲法,中断发生在系统调用中的时候不也是同样的情况吗?

论坛徽章:
0
27 [报告]
发表于 2009-11-25 13:15 |只看该作者
学习~~

论坛徽章:
0
28 [报告]
发表于 2009-11-25 13:41 |只看该作者

回复 #25 fox144215 的帖子

栈怎么处理不清楚,不过你的说法不太明白,”current在返回用户空间时会弹出保存在内核栈的寄存器数据,但是栈顶的数据是中断保存的,而不是current从用户空间进入内核空间时保存的那部分数据了“,感觉就是需要先弹出中断保存的数据,完成中断处理,之后再弹出用户空间进入内核空间的数据,回到用户态。

论坛徽章:
0
29 [报告]
发表于 2009-11-25 13:43 |只看该作者

回复 #24 scutan 的帖子

看了这个帖子,明白了不少,感觉这个帖子也可以停止了。呵呵,都是大牛们玩剩下的了

论坛徽章:
0
30 [报告]
发表于 2009-11-25 14:17 |只看该作者
原帖由 kouu 于 2009-11-25 13:15 发表
  确实很简单……
按你的讲法,中断发生在系统调用中的时候不也是同样的情况吗?



是你想的很简单,假设进程A因为系统调用而进入内核,此时内核栈顶保存的是当前的寄存器数据,某个时刻中断来了,此时栈顶保存的是中断处理前夕的寄存器数据,这部分数据在前一部分数据的上面,当中断返回时,弹出栈顶数据(只是中断保存的那部分),而系统调用返回时,弹出最先保存的那部分。


题外话:
高手或者自认高手的请加群66408715
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP