ImageVerifierCode 换一换
格式:PPT , 页数:26 ,大小:1.61MB ,
文档编号:6158199      下载积分:16 文币
快捷下载
登录下载
邮箱/手机:
温馨提示:
系统将以此处填写的邮箱或者手机号生成账号和密码,方便再次下载。 如填写123,账号和密码都是123。
支付方式: 支付宝    微信支付   
验证码:   换一换

优惠套餐
 

温馨提示:若手机下载失败,请复制以下地址【https://www.163wenku.com/d-6158199.html】到电脑浏览器->登陆(账号密码均为手机号或邮箱;不要扫码登陆)->重新下载(不再收费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录  
下载须知

1: 试题类文档的标题没说有答案,则无答案;主观题也可能无答案。PPT的音视频可能无法播放。 请谨慎下单,一旦售出,概不退换。
2: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
3: 本文为用户(hwpkd79526)主动上传,所有收益归该用户。163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

1,本文(signal-deliver.ppt)为本站会员(hwpkd79526)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!

signal-deliver.ppt

1、Linux内核源码分析之内核源码分析之 信号传递信号传递郭海林郭海林2012.11.3信号的处理阶段 信号的产生内核更新目标进程的数据结构更新目标进程的数据结构以表示新信号以被发送 信号的传递内核强迫目标进程对信号做出反应对信号做出反应与信号机制相关的数据结构信号响应的三种方式 显示地忽略信号 执行与信号相关的缺省操作 Terminate:进程被终止 Dump:Terminate+Core Ignore:忽略 Stop:进程被停止,即置为TASK_STOPPED Continue:置为TASK_RUNNING 通过调用相应的信号处理函数捕获信号(&sighand-actionnr-1)-sa.

2、sa_handler信号检测和响应时机 当前进程由于系统调用、中断或异常而进入系统空间以后,从系统空间返回到用户空间的前夕。当前进程在内核中进入睡眠以后刚被唤醒的时候(必定是在系统调用中),或者由于不可忽略信号的存在而提前返回到用户空间。do_signal()系统调用的重新执行系统调用的重新执行get_signal_to_deliver()for(;)/取出一个未加屏蔽的信号signr=dequeue_signal(current,¤t-blocked,info);/没有可处理信号,退出for循环if(!signr)break;/取得信号向量表的表项ka=&sighand-acti

3、onsignr-1;/根据ka-sa.sa_handler的值进行处理信号/A.显示忽略,继续寻找下一个挂起信号显示忽略,继续寻找下一个挂起信号if(ka-sa.sa_handler=SIG_IGN)continue;get_signal_to_deliver()/B.用户自定义的处理函数,跳出用户自定义的处理函数,跳出break,返回到,返回到do_signal()if(ka-sa.sa_handler!=SIG_DFL)*return_ka=*ka;if(ka-sa.sa_flags&SA_ONESHOT)/如果设置了标志SA_ONESHOTka-sa.sa_handler=SIG_DFL

4、;break;/*will return non-zero signr value*/C.如果信号处理为默认动作如果信号处理为默认动作/C1.为Ignore,如SIGCHLD,SIGCONT,SIGURG,SIGWINCH等信号,返回forif(sig_kernel_ignore(signr)/*Default is nothing.*/continue;/C2.为Stop,如SIGSTOP,SIGTSTP,SIGTIN,SIGTOU等信号,if(sig_kernel_stop(signr)./会调用schedule()切换进程continue;get_signal_to_deliver()/

5、C3.为Terminate+Core,如SIGQUIT,SIGILL,SIGTRAP,SIGABRT等等信号,执行到C4if(sig_kernel_coredump(signr).do_coredump(info-si_signo,info-si_signo,regs);/C4.为terminate,如SIGXCPU,SIGPROF,SIGPWR,SIGUNUSED等等信号,结束进程do_group_exit(info-si_signo);/end of for(;)从get_signal_to_deliver()函数返回的情形:没有非阻塞的信号可选择选择了一个用户自定义处理的信号捕获信号机制

6、l handle_signal()运行在内核态l 用户定义的信号处理函数运行在用户态l 在当前进程恢复“正常”执行前,必须先执行用户态的信号处理程序整个过程 在用户态堆栈为信号处理程序预设一个frame,把内核栈“原始frame”保存到此。内核插入对系统调用sigreturn的代码。修改内核栈中“原始frame”修改成为执行信号处理程序所需的frame。返回到用户空间,但执行的是信号处理程序。信号处理程序执行完之后,通过sigreturn返回到内核空间。在系统调用sigreturn中从用户态堆栈恢复“原始frame”。再从内核态返回用户态,继续执行原始的用户程序。handle_signal()

7、-setup_rt_frame()A.在用户态堆栈上分配一个frame,用来保存内核堆栈上“原始frame”分配分配frame:struct sigframe*frame=get_sigframe(ka,regs,sizeof(*frame),&fpstate);unsigned long sp=regs-sp;sp=align_sigframe(sp-frame_size);return(void _user*)sp;示意图(1)espframesigframeretcodeextramaskfpstatescsigpretcodesetup_rt_frame()B.填充struct sig

8、frame _put_user(sig,&frame-sig)ia32_setup_sigcontext(&frame-sc,fpstate,regs,set-sig0)_copy_to_user(frame-extramask,&set-sig1,sizeof(frame-extramask)put_user_ex(ptr_to_compat(restorer),&frame-pretcode);put_user_ex(*(u64*)&code),(u64*)frame-retcode);示意图(2)espframesigframeretcodeextramaskfpstatescsigpr

9、etcodeint 0 x80;movl 119,%eax;popl%eaxsetup_rt_frame()C.修改内核堆栈原来frameregs-sp=(unsigned long)frame;regs-ip=(unsigned long)ka-sa.sa_handler;/*Make-mregparm=3 work*/regs-ax=sig;regs-dx=0;regs-cx=0;loadsegment(ds,_USER32_DS);loadsegment(es,_USER32_DS);regs-cs=_USER32_CS;regs-ss=_USER32_DS;示意图(3)espframe

10、sigframeretcodeextramaskfpstatescsigpretcodeint 0 x80;movl 119,%eax;popl%eax内核态-用户态 D.执行信号处理程序示意图(4)sigframeretcodeextramaskfpstatescsigpretcodeint 0 x80;movl 119,%eax;popl%eaxespeip信号处理程序执行ret指令:popl%eip用户态-内核态 E.系统调用sigreturn 重回内核态示意图(5)sigframeretcodeextramaskfpstatescsigpretcodeint 0 x80;movl 11

11、9,%eax;popl%eaxeipespsys_sigreturn()F.恢复内核态的原始frame struct sigframe*frame=(struct sigframe*)(regs-sp-8);_copy_from_user(&set.sig1,&frame-extramask,sizeof(frame-extramask);restore_sigcontext(regs,&frame-sc,&ax);示意图(6)sigframeretcodeextramaskfpstatescsigpretcodeint 0 x80;movl 119,%eax;popl%eaxeipespframe内核态-用户态 G.回到用户程序正常执行流程回顾 从内核的角度:怎样从A向B发送一个信号信号的发送 B怎样执行这个信号信号的传递 从应用程序的角度:怎样发送一个信号kill,tkill,tgkill.目标进程应该阻塞哪些信号sigprocmask 目标进程如何响应收到的信号singnal,sigactionThank U For Listening!Understanding the Linux KernelRead the fucking source code!

侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|