集群系统MOSIX分析(7)
2008-12-01 11:04:48 来源:WEB开发网因此,我们可以说进程信号处理的状态是保留在DEPUTY方的。这样做也是很自然的。首先在MOSIX中,对于REMOTE进程,几乎所有的系统调用都是请求DEPUTY来处理,和信号相关的一些系统调用也不了例外。例如,sigprocmask()改变本进程得信号屏蔽位图,sigpending()检查有哪些信号已到达而未被处理,signal()和sigaction()安装信号处理程序。其次,在不少内核操作中,进程进入睡眠以后刚被唤醒时,都会检测信号的存在从而提前返回到用户空间。而DEPUTTY和REMOTE可以分别看作对系统上下文和用户上下文的抽象,所以DEPUTY保留着信号处理的状态。
信号响应
对信号的检测和响应总是发生在系统空间,通常发生在两种情况下:第一,当前进程由于系统调用、中断或异常而进入系统空间以后,从系统空间返回到用户空间的前夕。第二,当前进程在内核中进入睡眠以后刚被唤醒时,由于信号的存在而提前返回到用户空间。
当进程由于中断进入系统空间以后,中断处理程序服务完后,将会转到入口ret_from_intr 。当进程由于异常而进入系统空间后,将会跳到error_code从而最终转到ret_from_exception处理【参见entry.S】。如果中断或异常发生于用户空间,则转移到ret_check_reschedule,否则发生于内核空间,则到达restore_all。当进程由于系统调用进入系统空间,将最终走到ret_from_sys_call。
ENTRY(ret_from_sys_call)
。。。。。
ret_check_reschedule:
cli # need_resched and signals atomic test
cmpl $0,need_resched(%ebx)/*判断是否需要调度*/
jne reschedule
cmpl $0,sigpending(%ebx) /*判断是否有悬挂的信号/
jne signal_return /*如果有信号待处理,则跳到signal_return */
straight_to_mosix:
call SYMBOL_NAME(mosix_pre_usermode_actions)
testl %eax,%eax
jne ret_from_sys_call
restore_all:
RESTORE_ALL
ALIGN
signal_return:
sti # 开中断
handler
testl $(VM_MASK),EFLAGS(%esp)/*是否处于VM86模式*/
movl %esp,%eax
jne v86_signal_return /*是VM86模式的话,则转到v86_signal_return */
call SYMBOL_NAME(do_signal) /* do_signal 对信号进行处理*/
jmp straight_to_mosix
更多精彩
赞助商链接