欢迎来到天天文库
浏览记录
ID:41527151
大小:80.20 KB
页数:9页
时间:2019-08-26
《代码阅读报告2_涂李傲》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、代码阅读报告(2)涂李傲软012010013234说明:由于作业的说明文档中没有明确说明需要阅读的源代码文件,所以我选择阅读“xv6sourcecode”中的代码来取代源代码文件,如果有遗漏的地方请见谅…>源代码中的重要函数或语句的代码分析与注释函数仁swtch(2302——2327)S毗ch只是保存和恢复寄存器和上下文。当进程该释放CPU时,进程的内核将会调用s毗ch保存它自己的上下文并返回到调度器的上下文中。它将当前CPU寄存器压入栈,然后在*old中保存栈指针。然后swtch复制new到esp,弹出先前保存的寄存器并返回。(1)s毗ch:m
2、ovI4(%esp),%eaxmovI8(%esp),%edx代码功能:从esp中读数据到eax和edx并开始运行。我认为这个时候做这步操作是因为在后面的过程中要将esp重新赋值了,那样的话我们就无法知道esp中原来都有什么东西了。(2)pushI%ebppushI%ebxpushI%esipushI%edi代码功能:把将要被替换的程序所占用的寄存器状态压入栈中(以便以后用的时候恢复到被替换前的工作环境)。代码阅读指南里面说这个地方其实还有一个重要的寄存器eip也被保存了(好像是通过一个calI实现的,不过我好像没有找到…)(3)movI%esp
3、,(%eax)movI%edx,%esp代码功能:第一条语句中的括号好像意思就是不是明确是否要赋值,当structcontext*写到*old的时候。代码阅读指南里面说这个地方其实还有一个重要的寄存器eip也被保存了(好像是通过一个calI实现的)这个时候旧的数据就被保存完毕了,我们可以往swtch中写入新的数据了。接下来的一条语句中它将esp指向了edx位置。因为接下来要弹出的栈数据是由上一个同样的操作留下的,所以要读取数据的栈的数据结构和我们保存数据的栈的结构式完全一样的;(4)popI%edipopI%esipopI%ebxpopI%ebp
4、ret代码功能:弹出栈中%edi,%esi,%ebx和%6匕卩的值,然后返回(ret)。到这里我们就将swtch的底层细节给分析完毕了。接下来我们将默认已知swtch的实现。函数2:sched(2153——2168)当一个进程要让出CPU的时候必须获得ptable.lock,释放它的其他锁,然后调用schedo(1)if(!holding(&ptabIe.Iock))panic("schedptabIe・lock");if(cpu_>ncIi!=1)panic("schedIocks");if(proc.>state=RUNNING)panicC
5、'schedrunning");if(readeflags()&FL_IF)panic("schedinterruptibIe");代码功能:在调用sched的过程中先检查是否满足还回CPU的条件。(2)swtch(&proc-〉context,cpu->scheduIer);代码功能:如果满足的话,sched调用s毗ch在proc->context中保存当前上下文,然后切换到cpu->scheduIer中的调度器上下文。(3)intena=cpu->intena;cpu->intena=intena;代码功能:在这个过程中保持cpu的inten
6、a值不变。函数3forkret(void){//StillhoIdingptabIe・lockfromscheduIer・reIease(&ptabIe.Iock);//Returnto"caller",actuaIIytrapret(seeaIIocpr}代码功能:当一个新的进程第一次被调度时,前一个swtch并不是在sched处结束的,那么它将一直拥有lock,这样显然是不对的,所以我们需要将此时的lock给释放掉。所以这个函数的作用就是释放ptable.lock然后退出。函数4:scheduIer(1)sti0;代码功能:允许中断(我猜这个
7、是时间片轮转的基本机理)(是不是和第一次中的cli反一下…)(2)acquire(&ptabIe.Iock);for(p=ptabIe.proc;p<&ptabIe.proc{if(p->state!=RUNNABLE)continue;}代码功能:其实这一块比较直观,就是先请求一个lock,然后用for在进程表里面找一个可以运行的进程来运行。(3)proc=p;switchuvm(p);p->state=RUNNING;swtch(&cpu->scheduIer,proc->context);switchkvm();proc=0;代码功能:找到
8、一个可以运行的进程以后它设置一个CPU当前变量proc,用switchuvm切换到进程表,标记这个进程为RUNNABLE,然后调用s毗c
此文档下载收益归作者所有