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