免费注册 查看新帖 |

Chinaunix

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

如果在用户空间发生硬件中断会如何? [复制链接]

论坛徽章:
0
发表于 2008-05-28 19:48 |显示全部楼层
对于硬件中断和除0之类的异常,linux把它们的IDT的DPL都被设置成0了,也就是说,当前CPL=3时,是无法中断进入处理程序的。
那么如果当前CPU运行在用户空间,发生了硬件中断或异常,难道不进行处理了?

这显然不对,但究竟如何解释呢?

论坛徽章:
0
发表于 2008-05-29 00:23 |显示全部楼层
有三个概念:
当前CPU的CPL(也就是所说的当前运行在内核态还是用户态)
中断门的DPL
中断代码段的DPL


首先发生一个中断后,需要经过中断门。这时候用CPL与中断门的DPL比较,只有CPL的值不大于中断门的DPL,才能通过,换句话说当前CPU的级别
必须比中断门的DPL高或者至少相等,才能通过中断门.  中断门的DPL就好象一条“门槛”,CPU必须达到一定级别才能跨过去。

现在CPU通过了中断门,再来看中断代码段的DPL。这时候,要求CPU的CPL数值不大于中断代码段的DPL。 也就是说,中断代码段可以提升或者至少保
持CPU的运行级别,而不能降低CPU的运行级别。 执行中断代码时,CPU的CPL修改成中断代码的DPL.




具体见Linux内核源代码情景分析上册的194页

论坛徽章:
0
发表于 2008-05-29 08:51 |显示全部楼层
原帖由 OstrichFly 于 2008-5-28 19:48 发表
对于硬件中断和除0之类的异常,linux把它们的IDT的DPL都被设置成0了,也就是说,当前CPL=3时,是无法中断进入处理程序的。
那么如果当前CPU运行在用户空间,发生了硬件中断或异常,难道不进行处理了?

这显 ...

请参阅这篇文章:http://linux.chinaunix.net/bbs/thread-1004882-1-2.html,可以回答你的问题。  

论坛徽章:
0
发表于 2008-05-29 17:21 |显示全部楼层
原帖由 kissGNU 于 2008-5-29 00:23 发表
有三个概念:
当前CPU的CPL(也就是所说的当前运行在内核态还是用户态)
中断门的DPL
中断代码段的DPL


首先发生一个中断后,需要经过中断门。这时候用CPL与中断门的DPL比较,只有CPL的值不大于中断门的DP ...


谢谢!
正如你说的,进入中断时,CPL的值不能大于中断门的DPL,(也就是我在问题中说的IDT中的DPL),但从内核代码来看,内核已经把中断门的DPL设置成了0,这样的话,如果CPL=3,是如何进入的呢?

论坛徽章:
0
发表于 2008-05-29 17:26 |显示全部楼层
原帖由 frank_seng 于 2008-5-29 08:51 发表

请参阅这篇文章:http://linux.chinaunix.net/bbs/thread-1004882-1-2.html,可以回答你的问题。  


谢谢!
文章已经读了,但我还是有以下疑问:
文章中的第2步中,已经开始进行了堆栈切换,但在第二步之前,还需要进行当前CPL和中断门的DPL的比较,如果这个比较不成立的话,是进入不了第2部的。
但我看到内核把中断门的DPL设置成了0,也就是说,CPU运行在用户态时发生中断的话,是通过不了这个检查的,也就进入不了中断服务,但这显然是不可能的。所以比较迷惑。

[ 本帖最后由 OstrichFly 于 2008-5-29 17:33 编辑 ]

论坛徽章:
0
发表于 2008-05-29 18:41 |显示全部楼层
原帖由 OstrichFly 于 2008-5-29 17:26 发表


谢谢!
文章已经读了,但我还是有以下疑问:
文章中的第2步中,已经开始进行了堆栈切换,但在第二步之前,还需要进行当前CPL和中断门的DPL的比较,如果这个比较不成立的话,是进入不了第2部的。
但我看到 ...

拿X86CPU设计规范来说,如果来了个硬中断,不管当前运行在什么级别,CPU立刻切换到0级!

论坛徽章:
0
发表于 2008-05-29 19:35 |显示全部楼层
原帖由 OstrichFly 于 2008-5-29 17:26 发表


谢谢!
文章已经读了,但我还是有以下疑问:
文章中的第2步中,已经开始进行了堆栈切换,但在第二步之前,还需要进行当前CPL和中断门的DPL的比较,如果这个比较不成立的话,是进入不了第2部的。
但我看到 ...

LZ对interrupt gate和exception gate理解不错,但不够充分。
这两个gate中的DPL,只有在interrupt或excepition是由INT n指令(例如INT 3 INTO指令)引起时才检查,中断和异常发生时不检查。
这样做的目的是防止应用程序使用INT n指令引起一个中断。
对于INT 3这种调试目的的中断,linux采用了特殊的system interrupt gate,此时DPL为3。

论坛徽章:
0
发表于 2008-05-30 09:55 |显示全部楼层
我理解了。
我原先认为中断门的DPL会用于检查所有的中断,但其实中断门的DPL只用于检查INT指令产生的中断,而不用于检查硬件或异常产生的中断。
因此中断门的DPL不会影响用户态硬件中断或异常的处理。

谢谢frank_seng和zx_wing!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP