免费注册 查看新帖 |

Chinaunix

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

请问软中断的处理过程中会发生任务切换吗? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2007-06-21 15:45 |只看该作者
TO zx_wing

对不起,是我多较真了。

你知道问题的实质,只是没有从文字上回答好LZ。

论坛徽章:
0
12 [报告]
发表于 2007-06-21 15:49 |只看该作者
原帖由 思一克 于 2007-6-21 15:45 发表于 11楼  
TO zx_wing

对不起,是我多较真了。

你知道问题的实质,只是没有从文字上回答好LZ。

版主客气了,严谨的态度对于学习技术是很好的。只是我个人比较粗心,很难注意到细节。
呵呵,我来CU时间比较短,发现这里的版主都比较严谨,刚来的时候在c版和那位精通c标准的版主(好像叫wyxlinux,记错无怪)也争过很久,受益匪浅。
同样,刚才那个文件帖子的争论也让我很受益。

论坛徽章:
0
13 [报告]
发表于 2007-06-22 15:10 |只看该作者
简单的说就是: 即便softirq被hardware irq打断了,在hardware irq完成后,也是先到softirq,然后才能返回到正常的kernel控制路径。在返回过程中如果need_rescheduel标志被置位,则调用schedule函数进行切换。所以中断返回就附带了要继续softirq。

论坛徽章:
0
14 [报告]
发表于 2007-09-02 23:29 |只看该作者
原帖由 snow_insky 于 2007-6-22 15:10 发表
简单的说就是: 即便softirq被hardware irq打断了,在hardware irq完成后,也是先到softirq,然后才能返回到正常的kernel控制路径。在返回过程中如果need_rescheduel标志被置位,则调用schedule函数进行切换。所 ...


当一个soft irq正在执行时被一个hard irq中断,而这个hard irq又触发了另外一个soft irq,我们知道当一个soft irq执行时,本地处理器的的soft irq是被屏蔽的,也就是说后一个soft irq不会在hard irq返回时执行,那么它又是在哪里运行的呢?

论坛徽章:
0
15 [报告]
发表于 2007-09-06 11:12 |只看该作者
在2.4里:

     testl $(VM_MASK | 3), %eax
        jz restore_all

ret_from_intr会判断中断前的CPL,如果是3即用户态,才可能去reschdule。而如果是0即内核态,是直接restore_all,不会走到reschdule。这里保证了软中断不会被调度。

在2.6里:

     testl $(VM_MASK | 3), %eax
        jz resume_kernel        
#ifdef CONFIG_PREEMPT
ENTRY(resume_kernel)
        cmpl $0,TI_preempt_count(%ebp)  # non-zero preempt_count ?
        jnz restore_all  

如果定义了CONFIG_PREEMPT,就需要判断preempt_count,如果非0也是直接restore_all,不会走到reschdule。而进软中断中,preempt_count是非0的(如楼主所示)。这样也保证了软中断不会被调度。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP