NachOS课程设计操作系统课程设计说明书学院:信息科学与工程学院NachOS课程设计一、理解Nachos模拟的物理机的运行机制.....................................................................31.Sysdep模块分析(文件sysdep.ccsysdep.h).....................................................................52.中断模块分析(文件interrupt.ccinterrupt.h)....................................................................83.时钟中断模块分析(文件timer.cctimer.h)....................................................................124.终端设备模块分析(文件console.ccconsole.h)...............................错误!未定义书签。二、理解Nachos中线程运行机制......................................................................................141.工具模块分析(文件list.cclist.hutility.ccutility.h)......................................................172.线程启动和调度模块分析(文件switch.sswitch.h).....................................................183.线程模块分析(文件thread.ccthread.h)........................................................................204.线程调度算法模块分析(文件scheduler.ccscheduler.h)..............................................235.Nachos主控模块分析(文件main.ccsystem.ccsystem.h).............................................246.同步机制模块分析(文件synch.ccsynch.h).................................................................25三、理解Nachos中支持用户进程的机制..........................................................................27一、用户程序空间(文件address.cc,address.h)................................................................30二、系统调用(文件exception.cc,syscall.h,start.s)..........................................................33NachOS课程设计一、理解Nachos模拟的物理机的运行机制Machine类错误!未找到引用源。用来模拟计算机主机。它提供的功能有:读写寄存器。读写主存、运行一条用户程序错误!未找到引用源。的汇编指令、运行用户程序、单步调试用户程序、显示主存和寄存器状态、将虚拟内存错误!未找到引用源。地址转换为物理内存地址、陷入Nachos内核等等。Machine类错误!未找到引用源。实现方法是在宿主机上分配两块内存分别作为虚拟机的寄存器和物理内存。运行用户程序错误!未找到引用源。时,先将用户程序从Nachos文件系统中读出,写入模拟的物理内存中,然后调用指令模拟模块对每一条用户指令解释执行。将用户程序的读写内存要求,转变为对物理内存地址的读写。Machine类提供了单步调试用户程序的功能,执行一条指令后会自动停下来,让用户查看系统状态,不过这里的单步调试是汇编指令级的,需要读者对R2/3000错误!未找到引用源。指令比较熟悉。如果用户程序想使用操作系统提供的功能或者发出异常信号时,Machine调用系统异常陷入功能,进入Nachos的核心部分。Interrupt类错误!未找到引用源。用来模拟硬件中断系统。在这个中断系统中,中断状态有开,关两种,中断类型有时钟中断、磁盘中断、控制台写中断、控制台读中断、网络发送中断以及网络接收中断。机器状态有用户态,核心态和空闲态。中断系统提供的功能有开/关中断,读/写机器状态,将一个即将发生中断放入中断队列,以及使机器时钟前进一步。在Interrupt类错误!未找到引用源。中有一个记录即将发生中断的队列,称为中断等待队列。中断等待队列中每个等待处理的中断包含中断类型、中断处理程NachOS课程设计序的地址及参数、中断应当发生的时间等信息。一般是由硬件设备模拟程序把将要发生的中断放入中断队列。中断系统提供了一个模拟机器时钟,机器时钟在下列情况下前进:用户程序错误!未找到引用源。打开中断执行一条用户指令处理机没有进程正在运行机器时钟前进时,中断处理的过程如下图所示:NachOS课程设计中断系统成为整个Nachos虚拟机的基础,其它的模拟硬件设备都是建立在中断系统之上的。在此之上,加上Machine类错误!未找到引用源。模拟的指令解释器,可以实现Nachos的线程管理错误!未找到引用源。、文件系统管理错误!未找到引用源。、虚拟内存错误!未找到引用源。、用户程序错误!未找到引用源。和网络管理错误!未找到引用源。等所有操作系统功能。下图展示了Nachos系统的整体结构。用户程序线程管理错误!未找到引用源。网络协议文件系统虚拟内存错误!未找到引用源。终端设备时钟网络磁盘关中断中断队列中有应当发生的中断?取出队列中一个应当发生的中断,调用这个中断的处理程序去处理中断开中断中断处理程序要求进行正文切换?进行正文切换YNYNNachos中断处理时机NachOS课程设计中断系统指令解释和内存模拟Nachos系统的整体结构机器模拟的实现:1.Sysdep模块分析(文件sysdep.ccsysdep.h)Nachos的运行环境可以是多种操作系统,由于每种操作系统所提供的系统调用或函数调用在形式和内容上可能有细微的差别。sysdep模块的作用是屏蔽掉这些差别。1.1PoolFile函数语法:boolPoolFile(intfd)参数:fd:文件描述符,也可以是一个套接字(socket)功能:测试一个打开文件fd是否有内容可以读,如果有则返回TRUE,否则返回FALSE。当Nachos系统处于IDLE状态时,测试过程有一个延时,也就是在一定时间范围内如果有内容可读的话,同样返回TRUE。实现:通过select系统调用。返回:打开文件是否有内容供读取。1.2OpenForWrite函数语法:intOpenForWrite(char*name)参数:name:文件名功能:为写操作打开一个文件。如果该文件不存在,产生该文件;如果该文件已经存在,则将该文件原有的内容删除。实现:通过open系统调用。返回:打开的文件描述符。1.3OpenForReadWrite函数语法:intOpenForReadWrite(char*name,boolcrashOnError)参数:name:文件名crashOnError:crash标志功能:为读写操作打开一个文件。当crashOnError标志设置而文件不能读写打开时,系统出错退出。实现:通过open系统调用。返回:打开的文件描述符。NachOS课程设计1.4Read函数语法:voidRead(intfd,char*buffer,intnBytes)参数:fd:打开文件描述符buffer:读取内容的缓冲区nBytes:需要读取的字节数功能:从一个打开文件fd中读取nBytes的内容到buffer缓冲区。如果读取失败,系统退出。实现:通过read系统调用。返回:空。1.5ReadPartial函数语法:intReadPartial(intfd,char*buffer,intnBytes)参数:fd:打开文件描述符buffer:读取内容的缓冲区nBytes:需要读取的最大字节数功能:从一个打开文件fd中读取nBytes的内容到buffer缓冲区。实现:通过read系统调用。返回:实际读出的字节数。1.6WriteFile函数语法:voidWriteFile(intfd,char*buffer,intnBytes)参数:fd:打开文件描述符buffer:需要写的内容所在的缓冲区nBytes:需要写的内容最大字节数功能:将buffer缓冲区中的内容写nBytes到一个打开文件fd中。实现:通过write系统调用。返回:空1.7Lseek函数语法:voidLseek(intfd,intoffset,intwhence)参数:fd:文件描述符offset:偏移量whence:指针移动的起始点功能:移动一个打开文件的读写指针,含义同lseek系统调用;出错则退出系统。实现:通过lseek系统调用。返回:空。1.8Tell函数语法:intTell(intfd)参数:fd:文件描述符功能:指出当前读写指针位置实现:通过lseek系统调用。返回:返回当前指针位置。NachOS课程设计1.9Close函数语法:voidClose(intfd)参数:fd:文件描述符功能:关闭当前打开文件fd,如果出错则退出系统。实现:通过close系统调用。返回:空1.10Unlink函数语法:boolUnlink(char*name)参数:name:文件名功能:删除文件。实现:通过unlink系统调用。返回:删除成功,返回TRUE;否则返回FALSE。1.11OpenSocket函数语法:intOpenSocket()参数:无功能:申请一个socket。实现:通过socket系统调用。其中AF_UNIX参数说明使用UNIX内部协议。(Nachos是用SOCKET文件来模拟网络节点,所以采用UNIX内部协议。向该文件读写内容分别代表从该节点读取内容和向该网络节点发送内容)SOCK_DGRAM参数说明采用无连接定长数据包型的数据链路。返回:申请到的socketID。1.12CloseSocket函数语法:voidCloseSocket(intsockID)参数:sockID:socket标识功能:释放一个socket。实现:通过close系统调用。返回:无。1.13Abort函数语法:voidAbort()参数:无功能:退出系统(非正常退出)。实现:通过abort系统调用。返回:无。1.14Exit函数语法:voidExit(intexitCode)参数:exitCode:向系统的返回值功能:退出系统。实现:通过exit系统调用。NachOS课程设计返回:空2.中断模块分析(文件interrupt.ccinterrupt.h)中断模块的主要作用是模拟底层的中断机制。可以通过该模拟机制来启动和禁止中断(SetLevel);该中断机制模拟了Nachos系统需要处理的所有的中断,包括时钟中断、磁盘中断、终端读/终端写中断以及网络接收/网络发送中断。中断的发生总是有一定的时间。比如当向硬盘发出读请求,硬盘处理请求完毕后会发生中断;在请求和处理完毕之间需要经过一定的时间。所以在该模块中,模拟了时钟的前进。为了实现简单和便于统计各种活动所占用的时间起见,Nachos规定系统时间在以下三种情况下前进:执行用户态指令,时钟前进是显而易见的。我们