Linux.ChinaUnix.net
ChinaUnix | Linux首页 | 新闻 | 博客 | 文章 | 专栏 | 新手 | 方案 | 图书 | 下载 | 人才 | 手册 | wiki | 搜索     
Linux论坛
  会员: 密码: 免费注册 | 忘记密码 | 会员登录 | 搜索 | 帮助 


奥运快报: 
奥运热点:
 

在一次中断或者系统调用返回用户态的过程中,是否会将所有的未阻塞信号全部处理掉?
首页 » CU论坛 » Linux » 汇总贴列表 » 内核源码 »  
[打印] [订阅] [收藏] [推荐给朋友] [本帖文本页]
xpl
精灵




UID:397977
注册:2006-4-5
最后登录: 2008-09-05
帖子:187
精华:3

可用积分:310 (白手起家)
信誉积分:100
专家积分:33 (本版:25)
空间积分:0
推广积分:0

状态:...离线...

[资料] [站内短信] [Blog]


顶部
11楼 发表于 2008-5-15 17:07 


QUOTE:
原帖由 ahhhhwang 于 2008-5-15 16:52 发表




假如是系统调用成功返回,不涉及到系统调用重启,如果不是两个信号都被处理了,那您的意思是会怎么样?

ok, 我是这个意思.
我们终于互相明白对方的意思了.

另外, 没有不自在, 你不要又误解了.

交流才有进步.

继续~



您对本贴的看法:鲜花[0] 臭蛋[0]
空间积分可以换礼品了! | 有奖跟帖:服务器节能,奖50-100元图书 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘
ahhhhwang
圣骑士




UID:554698
注册:2007-4-21
最后登录: 2008-08-26
帖子:126
精华:0

可用积分:127 (白手起家)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

[资料] [站内短信] [Blog]


顶部
12楼 发表于 2008-5-15 17:29 
回复 #11 xpl 的帖子

呵呵,好的。
您上面说,假如是系统调用成功返回,不涉及到系统调用重启,那么会递送所有的未决信号,是这样吗?
您所说的递送所有未决信号的意思是我所说的:在系统调用返回用户态过程中被内核强制去执行这些待处理信号的处理函数吗?也就是说处理所有的待处理信号。因为你刚才说我误会你的意思,不是将两个信号都处理掉,所有我得再问一下这个问题。



您对本贴的看法:鲜花[0] 臭蛋[0]
空间积分可以换礼品了! | 有奖跟帖:服务器节能,奖50-100元图书 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘
xpl
精灵




UID:397977
注册:2006-4-5
最后登录: 2008-09-05
帖子:187
精华:3

可用积分:310 (白手起家)
信誉积分:100
专家积分:33 (本版:25)
空间积分:0
推广积分:0

状态:...离线...

[资料] [站内短信] [Blog]


顶部
13楼 发表于 2008-5-15 17:41 
是的. 是这个意思.


怎么感觉咱哥俩跟说相声似的



您对本贴的看法:鲜花[0] 臭蛋[0]
空间积分可以换礼品了! | 有奖跟帖:服务器节能,奖50-100元图书 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘
ahhhhwang
圣骑士




UID:554698
注册:2007-4-21
最后登录: 2008-08-26
帖子:126
精华:0

可用积分:127 (白手起家)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

[资料] [站内短信] [Blog]


顶部
14楼 发表于 2008-5-15 17:54 
回复 #13 xpl 的帖子

呵呵。自己的这个判断被确认的感觉很好。



您对本贴的看法:鲜花[0] 臭蛋[0]
空间积分可以换礼品了! | 有奖跟帖:服务器节能,奖50-100元图书 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘
zx_wing   帅哥 (骑着猪的青蛙)
大天使
学徒



UID:499746
注册:2006-12-4
最后登录: 2008-09-06
帖子:1940
精华:3

可用积分:1624 (家境小康)
信誉积分:100
专家积分:11 (本版:1)
空间积分:0
推广积分:0

来自:成都
状态:...保密...

[资料] [站内短信] [Blog]


顶部
15楼 发表于 2008-5-15 18:24 
我搭车问个问题。
曾今我以为明白系统调用重启的问题,即“系统调用睡眠,被唤醒时由于pending的信号回到用户态,则为系统调用被打断。信号处理完后自动重启”。这些认识来自于书籍和资料,没看过源码。刚才看两位讨论又去看了看代码,没有找到这个“唤醒进程时,去处理pending的信号”的位置。
除了这种情况,想不出其它情况系统调用需要重启。继续讨论一下?



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________


C调 ---- C语言
都是最喜欢的
空间积分可以换礼品了! | 有奖跟帖:服务器节能,奖50-100元图书 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘
ahhhhwang
圣骑士




UID:554698
注册:2007-4-21
最后登录: 2008-08-26
帖子:126
精华:0

可用积分:127 (白手起家)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

[资料] [站内短信] [Blog]


顶部
16楼 发表于 2008-5-15 19:14 


QUOTE:
原帖由 zx_wing 于 2008-5-15 18:24 发表

曾今我以为明白系统调用重启的问题,即“系统调用睡眠,被唤醒时由于pending的信号回到用户态,则为系统调用被打断。信号处理完后自动重启”。这些认识来自于书籍和资料,没看过源码。刚才看两位讨论又去看了看代码,没有找到这个“唤醒进程时,去处理pending的信号”的位置。

先问一下zx_wing兄第,第12楼我写的那些话,你觉得对否?如果觉得对的话,您觉得我在一楼说的导致这些结论的原因是不是也是对的。
我没有听明白您说的没有找到的“唤醒进程时,去处理pending的信号”。是指进程被别的进程发生信号时唤醒后重新开始执行,接着怎么样一步步执行到处理信号函数的过程吗?



您对本贴的看法:鲜花[0] 臭蛋[0]
空间积分可以换礼品了! | 有奖跟帖:服务器节能,奖50-100元图书 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘
zx_wing   帅哥 (骑着猪的青蛙)
大天使
学徒



UID:499746
注册:2006-12-4
最后登录: 2008-09-06
帖子:1940
精华:3

可用积分:1624 (家境小康)
信誉积分:100
专家积分:11 (本版:1)
空间积分:0
推广积分:0

来自:成都
状态:...保密...

[资料] [站内短信] [Blog]


顶部
17楼 发表于 2008-5-15 19:47 


QUOTE:
原帖由 ahhhhwang 于 2008-5-15 19:14 发表



先问一下zx_wing兄第,第12楼我写的那些话,你觉得对否?如果觉得对的话,您觉得我在一楼说的导致这些结论的原因是不是也是对的。
我没有听明白您说的没有找到的“唤醒进程时,去处理pending的信号”。是 ...

除了系统调用重启的内容外,我认为是对的。
没细看,内核检测信号的路径大概是这样的:(x86 2.6.20以前的内核在entry.s,以后的在entry_32.s)
work_pending -----> do_notify_resume(它会调用do_signal) --->resume_userspace_sig(其实就是resume_userspace)
而resume_userspace又会做:

QUOTE:
        andl $_TIF_WORK_MASK, %ecx        # is there any work to be done on
                                        # int/exception return?
        jne work_pending

所以这是个循环过程,应该是处理完所有信号再返回用户态。

系统调用重启的问题ULK3上有,我以前忽略了,等会再细看一下。



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________


C调 ---- C语言
都是最喜欢的
空间积分可以换礼品了! | 有奖跟帖:服务器节能,奖50-100元图书 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘
ahhhhwang
圣骑士




UID:554698
注册:2007-4-21
最后登录: 2008-08-26
帖子:126
精华:0

可用积分:127 (白手起家)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

[资料] [站内短信] [Blog]


顶部
18楼 发表于 2008-5-15 20:48 


QUOTE:
原帖由 zx_wing 于 2008-5-15 19:47 发表

除了系统调用重启的内容外,我认为是对的。
没细看,内核检测信号的路径大概是这样的:(x86 2.6.20以前的内核在entry.s,以后的在entry_32.s)
work_pending -----> do_notify_resume(它会调用do_signal) --->resume_userspace_sig(其实就是resume_userspace)
而resume_userspace又会做:

我手头没有2.6.20以后的内核代码,所以不知道do_notify_resume --->resume_userspace_sig这之间的过程,可以帖一下相关的完整代码吗?



您对本贴的看法:鲜花[0] 臭蛋[0]
空间积分可以换礼品了! | 有奖跟帖:服务器节能,奖50-100元图书 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘
zx_wing   帅哥 (骑着猪的青蛙)
大天使
学徒



UID:499746
注册:2006-12-4
最后登录: 2008-09-06
帖子:1940
精华:3

可用积分:1624 (家境小康)
信誉积分:100
专家积分:11 (本版:1)
空间积分:0
推广积分:0

来自:成都
状态:...保密...

[资料] [站内短信] [Blog]


顶部
19楼 发表于 2008-5-15 21:07 
就两行(qutoe不算字数太龌龊了)

QUOTE:
work_resched:
        call schedule
        LOCKDEP_SYS_EXIT
        DISABLE_INTERRUPTS(CLBR_ANY)        # make sure we don't miss an interrupt
                                        # setting need_resched or sigpending
                                        # between sampling and the iret
        TRACE_IRQS_OFF
        movl TI_flags(%ebp), %ecx
        andl $_TIF_WORK_MASK, %ecx        # is there any work to be done other
                                        # than syscall tracing?
        jz restore_all
        testb $_TIF_NEED_RESCHED, %cl
        jnz work_resched

work_notifysig:                                # deal with pending signals and
                                        # notify-resume requests
#ifdef CONFIG_VM86
        testl $VM_MASK, PT_EFLAGS(%esp)
        movl %esp, %eax
        jne work_notifysig_v86                # returning to kernel-space or
                                        # vm86-space
        xorl %edx, %edx
        call do_notify_resume
        jmp resume_userspace_sig




您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________


C调 ---- C语言
都是最喜欢的
空间积分可以换礼品了! | 有奖跟帖:服务器节能,奖50-100元图书 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘
zx_wing   帅哥 (骑着猪的青蛙)
大天使
学徒



UID:499746
注册:2006-12-4
最后登录: 2008-09-06
帖子:1940
精华:3

可用积分:1624 (家境小康)
信誉积分:100
专家积分:11 (本版:1)
空间积分:0
推广积分:0

来自:成都
状态:...保密...

[资料] [站内短信] [Blog]


顶部
20楼 发表于 2008-5-15 21:19 
大概看了一下,系统调用重启是这么一个过程。
先是两个条件:
1、系统调用在内核中被阻塞,进程因此被suspend了
2、进程是TASK_INTERRUPTIBLE的(当然,这个是肯定的)

此时,另一个进程或内核路径给这个suspend的进程发送了一个信号,该进程会被唤醒而返回用户态。此时,该进程的syscall还没有完成,则发生系统调用被打断的情况。do_signal会对这种情况进行判断,通过重新执行int80,或执行0号系统调用(只用于时间相关的syscall)重启。

信号发送唤醒进程的一个例子是:
send_sig--->send_sig_info---->specific_send_sig_info---->signal_wake_up ……



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________


C调 ---- C语言
都是最喜欢的
空间积分可以换礼品了! | 有奖跟帖:服务器节能,奖50-100元图书 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘

首页 » CU论坛 » Linux » 汇总贴列表 » 内核源码 »

 


Copyright © 2001-2008 ChinaUnix.net All Rights Reserved     联系我们:

感谢所有关心和支持过ChinaUnix的朋友们    转载本站内容请注明原作者名及出处

京ICP证041476号


清除 Cookies - Linux时代 - Archiver - WAP - TOP

Processed in 0.057263 second(s), 5 queries , Gzip enabled