操作系统课程设计_内存管理.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
操作系统课程设计_内存管理

作者:李晓琳 200800300117 刘泽民 200800300153 三、实现系统调用与内存管理 设计目标: 实现fork,exec,exit与join系统调用。 实现Nachos中用户程序的装入和内存页 式转换机制,实现多道程序驻留内存 实现带有TLB机制的的内存管理机制。 设计背景: 在nachos中,Thread类是来模拟一个线程的。在Thread类中,模拟了一个系统栈,并且在这个栈中保存系统寄存器的值。这里所说的系是指nachos运行的环境,对我们来说,就是所在的Linux系统。因为nachos要模拟线程的切换,因此必须要有能保存真实机器的CPU中的寄存器内容的地方。这就是说nachos自己实现了一个线程库。 在一个线程刚创建时,其处在JUST_CREATE状态,并且未分配系统栈。Thread类中,还有一个很重要的函数是fork,这个函数接收一个函数指针作为参数。在这个函数中,nachos会初始化这个线程的系统栈空间,并且会把所传入的函数的首址放在栈顶,这样,当这个线程被第一次运行的时候,就会从传入的这个函数处开始运行。 在线程还维护了一个AddrSpace类型的指针。当调用exec时,就会从文件中装载并初始化进程的用户空间。在nachos上,可执行文件是noff格式的。这种格式的文件中,包括一个文本段与三个数据段,并且在文件头中记录了其在虚拟空间的起始位置、在文件中的起始位置,以及大小,这样可以分别来初始化其用户空间的代码段、初始化数据段与未初始化数据段。这时候可以认为这个线程已经变成了一个进程。 在nachos中,对机器原模拟是在machine类中。在这个类中,用两个整型数组分别来模拟寄存器与内存。在machine中,有一个Run函数,这个是用来模拟机器的运行的。这个函数是一个死循环,在每一次循环的时候,首先从用户空间中取一条指令,然后在一个大的switch语句中解释执行指令。 在userpro目录下,有一个system.h的头文件,在这个头文件中,声明了与系统调用有关的函数头。对于test下的测试程序,就可以通过调用这个头文件中声明的函数来实现系统调用。 在用户程序被编译完成后,在函数调用的时候,首先会把参数放到r4-r7这几个寄存器中去,然后会把相应的系统调用编译成下而的指令: addiu $2,$0,SC_Halt syscall j $31 .end Halt 即首先是把系统调用的类型放入r2,然后再执行系统调用指令。在nachos内部,是用RaiseException来模拟系统调用的,这个函数会调用ExceptionHandle,依靠分支来处理各种系统调用。 设计分析: 制约Nachos实现多用户程序的根本原因在于Nachos在建立用户程序的时候,令虚拟地址和物理地址一一映射。每当一个新的用户程序建立的时 候,虚拟地址和物理地址都是从0开始分配,这样新的用户程序将会冲掉原 来在物理0开始的旧用户程序,发生错误。克服此种缺陷的方法之一是使用 位示图分配物 理地址。在做虚存和物理地址的映射时,使用bitmap的find 函数分配虚存对应的物理地址,但是如此使用bitmap之后,当处理虚地址 到内存的映射 的时候,就又不得不改用一个一个segment地读取,那么如 果采用code segment 和 data segment连续地在物理地址中存放,那么 在读取code和data的时候必须首先判断是否是从一个segment 0 端开 始,如果是,万事大吉,如果不是,那么以后每次都要分两次读一个 segment,控制逻辑十分复杂,找data的初始位置的时候也很混乱。所以 采取如 下方案:保留一部分内存碎片,code和data 存放的时候都始终从 一个segment的0开始,如果最后一部分不满一个segment,算为一个 segment,剩余部分为碎片。 实现Nachos系统调用fork,exec,exit与join实现Nachos的系统调用的时候,程序的执行采用的是异常中断的方法,接住异常的类在userprog/exception.cc,必须在此类中添加处理fork,exec,exit与join的方法。 关键代码及注释: 用户程序入口,用户空间: void StartProcess(_int fn) { char *filename = (char*)fn; OpenFile *executable = fileSystem-Open(filename); AddrSpace *space; if (executable == NULL) { printf(Unable to open file %s\n, filenam

文档评论(0)

yaoyaoba + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档