linux内核设计与实现

linux内核设计与实现

ID:30778996

大小:378.46 KB

页数:34页

时间:2019-01-03

linux内核设计与实现_第1页
linux内核设计与实现_第2页
linux内核设计与实现_第3页
linux内核设计与实现_第4页
linux内核设计与实现_第5页
资源描述:

《linux内核设计与实现》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、进程管理一、FORK()函数的两次返回的具体情况对于fork来说,父子进程共享同一段代码空间,所以给人的感觉好像是冇两次返回,其实对于调用fork的父进程来说,如果fork出来的子进程没有得到调度,那么父进程从fork系统调用返回,同时分析sys_fork知道,fork返回的是子进程的id。再看fork出來的了进程,由copy_process函数可以看出,了进程的返回地址为ret_from_fork(和父进程在同一个代码点上返冋),返冋值肓接置为0。所以当了进程得到调度的时候,也从fork返回,返回值为0«关键注

2、意两点:l.fork返冋后,父进程或子进程的执行位置。(首先会将当前进程eax的值做为返回值)2.两次返回的pid存放的位置。(eax中)进程调用copy_process得到lastpid的值(放入eax中,fork正常返回后,父进程中返回的就是lastpid)子进程任务状态段tss的eax被设置成0,fork,c中p->tss.eax=0;(如果了进程要执行就需要进程切换,当发生切换时,了进程tss中的eax值就调入eax寄存器,子进程执行时首先会将eax的內容做为返回值)当子进程开始执彳亍吋,copy_pro

3、cess返回eax的值。fork()后,就是两个任务同时进行,父进程用他的tss,子进程用白己的tss,在切换时,各用各的eax中的值.所以,"一次调用两次返回”是2个不同的进程!例子:intmain(){pid_tpid;pid=fork();if(pid<0){fprintf(stderr,"ForkFailed,z);exit(-1);}elseif(pid==0){printf("ch订dprocess");}else{printf("parentprocess");return0;这个程序执

4、行为什么总是显示:chiIdprocessparentprocess而不会先是parent示是ch订d呢?答:看这一句:pid=fork()当执行这一句时,当前进程进入fork()运行,此时,fork()内会用一段嵌入式汇编进行系统调用:int0x80(具体代码可参见内核版本0.11的unistd.h文件的133行_syscal10函数)。这时进入内核根据此前写入eax的系统调用功能号便会运行sys_fork系统调用。接着,sys_fork中首先会调用C函数find_empty_proccss产纶一个新的进程,然

5、后会调用C函数copy_procesS将父进程的内容复制给子进程,但是子进程tss中的eax值赋值为0(这也是为什么子进程中返回0的原因),当赋值完成后,copy_process会返回新进程(该子进程)的linux进程描述符一task_struct结构为了管理进程,操作系统必须对每个进程所做的事悄进行清楚地描述,为此,操作系统使用数据结构来代表处理不同的实体,这个数据结构就是通常所说的进程描述符或进程控制块,在lirrnx系统中,这就是taskstruct结构,在includelinuxsched.h文件中定

6、义。每个进程都会被分配一个task_struct结构,它包含了这个进程的所有信息,在任何时候操作系统都能跟踪这个结构的信息,这个结构是linux内核汇总最重要的数据结构,下面我们会详细的介绍。这个结构的源代码及其注释如下,Z后对其进行了分类解禅。//进程描述符taskstructstructtaskstruct{/**offsetsofthesearehardcodedelsewhere-touchwithcare*/volati1elongstate;/*Tunrunnable,0runnable,>0stop

7、ped*///-l不能运行0运行>0停止unsignedlongflags;/*perprocessflags,definedbelow*///进程标志,在下面定义intsigpending;//进程上是否有待处理的信号mm_segment_taddr_limit;/*threadaddressspace:进程地址空间O-OxBFFFFFFFforuser-thead0-OxFFFFFFFFforkernel-thread*/volatilelongneed_resched;//调度标丿忐,表示该进程是否需要重新

8、调度,若非0,则当从内核态返回到用八态,会发生调度intlock_depth;/*Lockdepth*///锁深度/**offset32beginshereon32-bitplatforms・Wekeep*al1fieldsinasinglecachelinethatareneededfor*thegoodness()loopinscheduleO.*/longcount

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。