代码阅读报告2_涂李傲.docx

  1. 1、本文档共9页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
代码阅读报告2_涂李傲

代码阅读报告(2)涂李傲 软012010013234说明:由于作业的说明文档中没有明确说明需要阅读的源代码文件,所以我选择阅读“xv6 source code”中的代码来取代源代码文件,如果有遗漏的地方请见谅…源代码中的重要函数或语句的代码分析与注释函数1:swtch(2302——2327)Swtch只是保存和恢复寄存器和上下文。当进程该释放CPU时,进程的内核将会调用swtch保存它自己的上下文并返回到调度器的上下文中。它将当前CPU寄存器压入栈,然后在*old中保存栈指针。然后swtch复制new到esp,弹出先前保存的寄存器并返回。(1)swtch:movl 4(%esp), %eaxmovl 8(%esp), %edx代码功能:从esp中读数据到eax和edx并开始运行。我认为这个时候做这步操作是因为在后面的过程中要将esp重新赋值了,那样的话我们就无法知道esp中原来都有什么东西了。(2)pushl %ebppushl %ebxpushl %esipushl %edi代码功能:把将要被替换的程序所占用的寄存器状态压入栈中(以便以后用的时候恢复到被替换前的工作环境)。代码阅读指南里面说这个地方其实还有一个重要的寄存器eip也被保存了(好像是通过一个call实现的,不过我好像没有找到…)(3)movl %esp, (%eax)movl %edx, %esp代码功能:第一条语句中的括号好像意思就是不是明确是否要赋值,当struct context*写到*old的时候。代码阅读指南里面说这个地方其实还有一个重要的寄存器eip也被保存了(好像是通过一个call实现的)这个时候旧的数据就被保存完毕了,我们可以往swtch中写入新的数据了。接下来的一条语句中它将esp指向了edx位置。因为接下来要弹出的栈数据是由上一个同样的操作留下的,所以要读取数据的栈的数据结构和我们保存数据的栈的结构式完全一样的;(4)popl %edipopl %esipopl %ebxpopl %ebpret代码功能:弹出栈中%edi,%esi,%ebx和%ebp的值,然后返回(ret)。到这里我们就将swtch的底层细节给分析完毕了。接下来我们将默认已知swtch的实现。函数2:sched(2153——2168)当一个进程要让出CPU的时候必须获得ptable.lock,释放它的其他锁,然后调用sched。(1)if(!holding(ptable.lock)) panic(sched ptable.lock);if(cpu?ncli != 1) panic(sched locks);if(proc?state == RUNNING) panic(sched running);if(readeflags()FL_IF) panic(sched interruptible);代码功能:在调用sched的过程中先检查是否满足还回CPU的条件。(2)swtch(proc-context, cpu-scheduler);代码功能:如果满足的话,sched调用swtch在proc-context中保存当前上下文,然后切换到cpu-scheduler中的调度器上下文。(3)intena = cpu-intena;cpu-intena = intena;代码功能:在这个过程中保持cpu的intena值不变。函数3 forkret(void){ // Still holding ptable.lock from scheduler. release(ptable.lock); // Return to caller, actually trapret (see allocpr}代码功能:当一个新的进程第一次被调度时,前一个swtch并不是在sched处结束的,那么它将一直拥有lock,这样显然是不对的,所以我们需要将此时的lock给释放掉。所以这个函数的作用就是释放ptable.lock然后退出。函数4 :scheduler(1)sti();代码功能:允许中断(我猜这个是时间片轮转的基本机理)(是不是和第一次中的cli反一下…)(2)acquire(ptable.lock);for(p = ptable.proc; p ptable.proc{ if(p?state != RUNNABLE)continue;……}代码功能:其实这一块比较直观,就是先请求一个lock,然后用for在进程表里面找一个可以运行的进程来运行。(3)proc = p;switchuvm(p);p?state = RUNNING;swtch(cpu?scheduler, proc?context);switchkvm();proc = 0;代码功能:找到一个可以运行的进程以后它设置一个CPU当前

文档评论(0)

xcs88858 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档