操作系统设计与实作报告.doc

上传人:asd****56 文档编号:70344411 上传时间:2023-01-19 格式:DOC 页数:10 大小:222KB
返回 下载 相关 举报
操作系统设计与实作报告.doc_第1页
第1页 / 共10页
操作系统设计与实作报告.doc_第2页
第2页 / 共10页
点击查看更多>>
资源描述

《操作系统设计与实作报告.doc》由会员分享,可在线阅读,更多相关《操作系统设计与实作报告.doc(10页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、操作系统设计与实作报告主题:Signal成员:吴正敏 陈信瑜 张简光哲 郭闵嘉 李俊岳 卢颖志 林胜尉一、 背景UNIX中有几种历史悠久的处理程序间通讯机制(IPC、Inter-process communication),Signal是其中之一。系统核心利用Signal来通知处理程序某些事件发生了。使用者通常利用Signal来放弃执行某个处理程序或将交谈式的程序切换到某个状态。所以说Signal是software interrupts。Signal很早就有了,像早期的Unix版本,不过那时有提供的Signal并不可靠(像Version 7),直到4.3BSD和SVR3做了一些改变,加入了re

2、liable signals。可惜的是两者彼此并不相容。但幸运的,POSIX.1有提供了标准化的signal 函式。Signal的编号在不同的UNIX版本有不同的设定,表一是Linux的编号方式,大致是合乎POSIX的标准。表一: Signal表列Singal nameNumberFunctionSIGHUP1hangupSIGINT 2interruptSIGQUIT 3quitSIGILL4illegal instructionSIGTRAP5trace trapSIGABRT6abort (generated by abort(3) routine)SIGIOT6Input/Output

3、 Trap (obsolete)SIGBUS7bus errorSIGFPE8arithmetic exceptionSIGKILL9kill (cannot be caught, blocked, or ignored)SIGUSR110user-defined signal 1SIGSEGV11segmentation violationSIGUSR212user-defined signal 2SIGPIPE13write on a pipe or other socket with no one to read itSIGALRM14alarm clockSIGTERM15softwa

4、re termination signalSIGTKFLT16SIGCHLD17child status has changedSIGCONT18continue after stopSIGSTOP19stop (cannot be caught, blocked, or ignored)SIGTSTP20stop signal generated from keyboardSIGTTIN21background read attempted from control terminalSIGTTOU22background write attempted to control terminal

5、SIGURG23urgent condition present on socketSIGXCPU24cpu time limit exceeded (see getrlimit(2)SIGXFSZ25file size limit exceeded (see getrlimit(2)SIGVTALRM26virtual time alarm (see getitimer(2)SIGPROF27profiling timer alarm (see getitimer(2)SIGWINCH28window changed (see termio(4) and win(4S)SIGIO,SIGPO

6、LL29I/O is possible on a descriptor (see fcntl(2V)SIGPWR 30Power Failure (for UPS)SIGUNUSED31二、 数据结构struct task_struct /* these are hardcoded - dont touch */volatile long state;/* -1 unrunnable, 0 runnable, 0 stopped */long counter;long priority;unsigned long signal;unsigned long blocked;/* bitmap o

7、f masked signals */unsigned long flags;/* per process flags, defined below */int errno;long debugreg8; /* Hardware debugging registers */struct exec_domain *exec_domain;/* various fields */struct linux_binfmt *binfmt;struct task_struct *next_task, *prev_task;struct task_struct *next_run, *prev_run;u

8、nsigned long saved_kernel_stack;unsigned long kernel_stack_page;int exit_code, exit_signal;/* ? */unsigned long personality;int dumpable:1;int did_exec:1;/* shouldnt this be pid_t? */int pid;int pgrp;int tty_old_pgrp;int session;/* boolean value for session group leader */int leader;intgroupsNGROUPS

9、;/* * pointers to (original) parent process, youngest child, younger sibling, * older sibling, respectively. (p-father can be replaced with * p-p_pptr-pid) */struct task_struct *p_opptr, *p_pptr, *p_cptr, *p_ysptr, *p_osptr;struct wait_queue *wait_chldexit;/* for wait4() */unsigned short uid,euid,su

10、id,fsuid;unsigned short gid,egid,sgid,fsgid;unsigned long timeout, policy, rt_priority;unsigned long it_real_value, it_prof_value, it_virt_value;unsigned long it_real_incr, it_prof_incr, it_virt_incr;struct timer_list real_timer;long utime, stime, cutime, cstime, start_time;/* mm fault and swap info

11、: this can arguably be seen as either mm-specific or thread-specific */unsigned long min_flt, maj_flt, nswap, cmin_flt, cmaj_flt, cnswap;int swappable:1;unsigned long swap_address;unsigned long old_maj_flt;/* old value of maj_flt */unsigned long dec_flt;/* page fault count of the last time */unsigne

12、d long swap_cnt;/* number of pages to swap on next pass */* limits */struct rlimit rlimRLIM_NLIMITS;unsigned short used_math;char comm16;/* file system info */int link_count;struct tty_struct *tty; /* NULL if no tty */* ipc stuff */struct sem_undo *semundo;struct sem_queue *semsleeping;/* ldt for th

13、is task - used by Wine. If NULL, default_ldt is used */struct desc_struct *ldt;/* tss for this task */struct thread_struct tss;/* filesystem information */struct fs_struct *fs;/* open file information */struct files_struct *files;/* memory management info */struct mm_struct *mm;/* signal handlers */

14、struct signal_struct *sig;#ifdef _SMP_int processor;int last_processor;int lock_depth;/* Lock depth. We can context switch in and out of holding a syscall kernel lock. */#endifstruct signal_struct /*在task structure 中有*sig */int count;struct sigaction action32;struct sigaction _sighandler_t sa_handle

15、r;/* SIG_DFL,(代表该讯号的标准处理例程) SIG_IGN, (代表忽略该讯或 */sigset_t sa_mask;/* signals在执行handler时被block */unsigned long sa_flags;/*SA_ONSTACK:在signal的堆栈里SA_INTERRUPT:在signal return的时候不可以重新开始系统 SA_RESETHAND:当得到signal时重新设定handler成SIG_DFL SA_NOCLDSTOP:在child stop的时候不要送SIGCHLD */void (*sa_restorer)(void);三、 流程图四、

16、详细分析System callkill(int pid, int sig)送出编号sig的signal给一个process或是同一群组的一些process,规则如下:pid 0:process把signal送给编号pid的process。pid = 0:process把signal送给同一组的所有porcess。pid = -1:process把signal送给所有process,除了system process和自己。pid 侦测有无错误,如果count=0 return errorn 335-336:若pid0,则signal送给编号为pid的processkill_pg(int pgrp

17、, int sig, int priv)用来送signal给groupn 264-265:判断是否合法,sig必须在132间且pgrp(process group id)要比0大否则signal值是错误的。n 266-273:若process的group id是pgrp则会送出signal给它,send_sig如果成功会回传0。n 274:判断是否有传送成功,found=0表示没找到process回传error found0,return 0。kill_proc(int pid, int sig, int priv)送signal给processn 305-306:sig要在132之间n 30

18、7-310:若有找到process的pid则送signal sig给它,sent sig如果成功会回传0。n 311:如果找不到任何process回传errorsend_sig(unsigned long sig,struct task_struct * p,int priv)n 7576:p不能是空的(p表要接受signal的process)而且sig不能大于32,因为singal只有32种,所以只要p为null或是sig大于32,function便会return -EINVAL (-EINVAL表示invalid sig)n 77:看看是normal process还是super user

19、,且检查signal是否为SIGCONT,如果是的话再看要接收signal的process是否跟目前正在执行的process在同一个session里(currentsession 表正在执行的process,psession表示要接收的process)。n 7879:检查传送signal的process的effective user ID和接收signal的process的saved setuser ID是否match1n 80:检查是否为super usern 81:如果以上的条件均成立,则return -EPERM(表示no privilege)n 8283:如果sig 0,则表示没有送i

20、gnal,就直接returnn 8788:如果psig 0,则表没收到signal,便直接returnn 8991:先看sig是否为SIGKILL或是SIGCONT(SIGCONT表示让程序继续执行),如果是的话再看pstate(程序状态)是否为TASK_STOPPED(工作停止),是的话则执行wake_up_process因为signal指示为SIGCONTn 92:将pexit_code设为0n 9395:将SIGSTOP、SIGTSTP(Z)、SIGTTIN、SIGTTOU reset,也就是将这四个sugnal disable掉,因为之前的判断得知现在的signal是要让process

21、继续执行程序,所以要将会停止执行的signal disablen 9697:同理,如果signal为SIGSTOP、SIGTSTP、SIGTTIN、SIGTTOU,就把SIGCONT disablegenerate(unsigned long sig, struct task_struct * p)n 31:建立一个signal的maskn 32:将sa设为psigactionsig1n 39:确定signal没有被block住还有process没有被trace,因为如果上述条件成立,则能确定要接受signal的process会马上处理signaln 41-42:如果sa_handler为SI

22、G_IGN且sig不为SIGCHLD(child status has changed)就return。n 44-46:如果sa_handler为SIG_DFL(default action)以及之后四个条件有一成立,则return。但default不处理n 48:将signal设定起来n 49:若接收signal的行程为可中断,则此signal不会被blockn 50:则把那个行程唤醒force_sig(unsigned long sig, struct task_struct * p)n 59:将signal的编号减(把132号转成第031个位置)n 60:如果p是在zombie状态,则不

23、做任何事n 61:宣告一个UL(unsigned long:32bit)的值1,向左shift sign个位置后,把值设给maskn 62:将sa这个指标,指向正确的handler起始位置n 63:将signal的第sig个bit设成1(与mask做or)n 64:将blocked的第sig个bit设成0(与mask做and)n 65:若sa_handler的flag为ignoren 66:则把它改成default handlern 67:若process的state为可中断n 68:则wake up processkill_sl(int sess, int sig, int priv)n 2

24、88:sig的值要在132之间(这里的source code好像有问题,sig0 or sig=0?)n 289:若不在范围内,回传错误n 290:检查每个process,看是不是session leadern 292:若是session leader,则送sig给session leader(call send_sig())n 294:用found来累计session leader个数n 298:若found 0 则正常结束,否则回传错误代码注:for_each_task()定义在SCHED.H, line 491属于Kernal的function.System callsigaction(

25、int sig, struct sigaction *act, *oact)函式sys_sigaction()是sys_signal()的最新且具有扩充功能的版本,它可用来更精确地指定欲采用的讯号处理例程。我们必须在new所代表的结构中填入新的处理例程的位地,如果old的值不等于NULL,旧的例程的任址将会填入old所代所的结构中。实作是检查和改变signal action (取代signal()。signal()的routine不是NULL,则会被return回去。用法:sigaction(int signum, const struct sigaction * action, struct

26、 sigaction * oldaction)中signum指的是signal number,定义在signal.h里;action指的是新的action, oldaction指的是旧的action。如果act不为NULL,则代表指定了新的signal处理函式给sig所指定的signal。而如果oact不为0则把旧的处理函式存到这里。Exp:sigaction(SIGHUP,&new_action,NULL);把SIGHUP的signal handler改成new_action里的handler。System call sigprocmask(int how, sigset_t *set, *

27、oset)如果只要管制暂缓处理的屏蔽时,我们可以使用sigprocmask(). 但SIGKILL, SIGSTOP 是不能暂缓处理的,如在被generate时正好被block,那SIGFPE, SIGKILL, SIGSEGV将没有被定义。用法:sigpromask (int how, sigset_t *set, sigset_t *oset)中how指的是屏蔽方式,而set为一signal mask,oset则是用来存旧的singal mask的地方。Exp:sigaction(SIG_SETMASK,&new_set,NULL);是把目前的signal_mask用new_set来取代。

28、System call sigpending(sigset_t *set)可用来检查处理程序是否有待处理的讯号,这些待处理的讯号会被标记在set中,而传回值为零。 用法:sigpending(sigset_t *set)中set是用来标明那些待处理的signals。如果成功Sigpending()把待处理讯号标明在变量set中,而回传0。Exp:sigpending(&singal_set);取得目前待处的讯号,标明在set里。System call ssetmask(sigset_t mask), sgetmask(void)分别可用来取得或设定暂缓处理的讯号屏蔽。回传值都是回传呼叫此二函式

29、时的signal mask值(ssetmask指的是未改变的signal mask)。而mask传递的是要改变的signal mask值,当一个signal在mask中的对应bit被设定,则这估signal将被blocked住。前者只是传回current-blocked,后者先把SIGKILL级SIGSTOP从传给它的屏蔽中删除,所得的结果再填入处理程序结构System call sigsuspend(const sigset_t *set)set用来传递signal mask。这个function会把process的signal mask用set取代,并暂停process直到有一个有hand

30、ler或结束process的signal传递进来。也就是说process会暂停直到有一个不在set中的signal传进来为止。有了上二个函式,我们可以把某些讯号设定为暂缓处理或是解除设定。而有了sys_sigsuspend(),我们可以在单一行动中完成改变处理程序的讯号屏蔽与暂停该处理程序的执行这二件事,处理程序会被切换成睡眠状态直到有不属于暂缓处理的讯号到来为止。sys_sigaction(int signum, const struct sigaction * action, struct sigaction * oldaction)n 155-156:检查signal编号是否介于132n

31、 157:把p指向旧的signal的处理函式n 158-170:假如新的action不是空的,检查user space是否为可读,若为可读,则将action的内容复制到new_sa(呼叫memcpy_fromfs(&new_sa, action, sizeof(struct sigaction); &new_sa, action, sizeof(struct sigaction)n 171-176:如果oldaction 不为NULL,把旧的sigaction存到oldaction里n 177-180:把p指向new_sa(设定新的signal handler)sys_sigprocmask(

32、int how, sigset_t *set, sigset_t *oset)n 34-52:假如变数set(new mask)不是NULL,则若how变量为SIG_BLOCK,就把new_set加入现在的blocked mask;若how为SIG_UNBLOCK,把new_set从blocked mask移除;若为SIG_SETMASK,就把目前blocked mask设为newset。n 53-58:假如oset变量不为NULL,把old_set拷贝到osetsys_sigpending(sigset_t *set)n 84-86:检查set是否可写,如果可以写,就把blocked 的signal拷贝到set。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 其他杂项

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁