Nachos源码分析与补充完善.docx

上传人:b****6 文档编号:3903750 上传时间:2022-11-26 格式:DOCX 页数:5 大小:22.21KB
下载 相关 举报
Nachos源码分析与补充完善.docx_第1页
第1页 / 共5页
Nachos源码分析与补充完善.docx_第2页
第2页 / 共5页
Nachos源码分析与补充完善.docx_第3页
第3页 / 共5页
Nachos源码分析与补充完善.docx_第4页
第4页 / 共5页
Nachos源码分析与补充完善.docx_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

Nachos源码分析与补充完善.docx

《Nachos源码分析与补充完善.docx》由会员分享,可在线阅读,更多相关《Nachos源码分析与补充完善.docx(5页珍藏版)》请在冰豆网上搜索。

Nachos源码分析与补充完善.docx

Nachos源码分析与补充完善

山东科技大学信息学院eagle_姓名XXX学号20060105XXXX班级计算机(计算机科学方向)06-2班指导教师XX撰写日期2009年1月1日山东科技大学信息学院eagle_..........................................................................................................................31、概述.................................................................................................................................32机器模拟............................................................................................................................43进程管理............................................................................................................................83.1Nachos进程概述.........................................................................................................83.2线程运行与切换......................................................................................................124.CPU调度..........................................................................................................................145.用户程序的运行............................................................................................................166.系统调用..........................................................................................................................18Nachos.........................................................................................................201.系统调用部分..................................................................................................................202.进程调度部分................................................................................................................24山东科技大学信息学院eagle_一、1Nachos(全称为NotAnotherCompletelyHeuristicOperatingSystem)是加州大学伯克利分校开发的教学用操作系统。

作为教学用操作系统,Nachos实现简单并且尽量缩小与实际操作系统之间的差距,目的是为了向学生展示一个相对真实的操作系统的内部结构及其实现方式。

它有几个突出的特点:

�8�5采用虚拟机实现Nachos是建立在一个软件模拟的虚拟机之上的,模拟了MIPSR2/3000的指令集、主存、中断系统、网络以及磁盘系统等操作系统所必须的硬件系统。

许多现代操作系统大多是先在用软件模拟的硬件上建立并调试,最后才在真正的硬件上运行。

用软件模拟硬件的可靠性比真实硬件高得多,不会因为硬件故障而导致系统出错,便于调试。

虚拟机可以在运行时报告详尽的出错信息并统计系统运行情况。

�8�5可以方便扩展Nachos不是向学生展示一个成功的操作系统,而是让学生在一个框架下进行扩展。

例如一个完整操作(例如Unix)的进程管理机制是很复杂的,但是总的来说,就是需要实现进程调度以及进程同步和互斥、进程间通信等机制以及与其有关的重要数据结构的维护。

Nachos中实现这些内容的大部分,但是在很多方面作了一定的限制,比如只实现了FIFO的调度算法、缺乏进程间通信等,学生可以运用操作系统的相关知识去完善Nachos,逐步消除这些限制。

易于理解Nachos的主体是用C实现的。

利用面向对象语言的抽象性,它能够清楚地描述操作系统各个部分的接口。

Nachos没有用到面向对象语言的所有特征,如继承性、多态性等,所以它的代码就更容易阅读和理解。

除了运行在虚拟机上以外,Nachos和真实的操作系统相比还有几点不同。

首先是不确定性,Nachos是在宿主机上运行的进程,在本质上是一个程序,因此在同样的输入顺序、输入参数的情况下,Nachos运行的结果是完全一样的,山东科技大学信息学院eagle_不会有硬件错误的干扰。

这样可以让使用者将注意力集中在程序代码上,而不受操作系统不确定性的干扰。

但是不确定性是操作系统所必须具有的特征,Nachos采用了随机因子模拟了真实操作系统的不确定性。

其次,Nachos中的时间是虚拟的,它利用一个Timer类模拟了真正的时间,通过增加计数变量的值实现时钟的前进,它的时间是跳跃的,而真实操作系统中的时间利用了石英晶振,因而是连续的(相对于我们的感受而言)。

图1.1是Nachos的基本结构,下面分别介绍Nachos的架构和已实现的功能,包括机器模拟、进程管理、系统调用、虚拟内存和文件系统。

NachosFileSystemStatusInterruptMachineTimerSynchDiskPostOfficeSchedulerThread图1.12Nachos只是运行在宿主操作系统以及宿主机器上的一个进程,这个进程包含了系统内核、MIPS指令集代码和虚拟机,在其上可以运行用户程序。

相比系统内核运行于宿主机的内存中,用户程序运行于Nachos模拟出的内存中。

如上所述,Nachos的虚拟机模拟了一台计算机的基本部分,如CPU、主存、寄存山东科技大学信息学院eagle_器、中断系统,还包括一些外部设备,如终端设备、网络以及磁盘系统。

下面对机器模拟部分的各个类和数据结构作分析说明。

MachineMachine类用来模拟计算机主机,提供了一些基本功能,部分属性和接口函数如下:

voidRun运行一个用户程序,charmainMemoryintregistersNumTotalRegs模拟主存和寄存器组intReadRegisterintnumvoidWriteRegisterintnumintvalue读/写寄存器voidDebuggerboolsingleStep用户程序调试(汇编级)和调试标志InterruptInterrupt类用来模拟硬件中断系统。

主要数据结构如下:

enumIntStatusIntOffIntOn中断状态,有IntOn(开),IntOff(关)两种,enumMachineStatusIdleModeSystemModeUserMode中断类型,有TimerInt(时钟中断)DiskInt(磁盘中断)ConsoleWriteIntConsoleReadInt(控制台读/写中断)NetworkSendInt(网络发送)NetworkRecvInt(网络接收)。

山东科技大学信息学院eagle_enumIntTypeTimerIntDiskIntConsoleWriteIntConsoleReadIntNetworkSendIntNetworkRecvInt机器状态,有SystemMode(内核)UserMode(用户)和IdleMode(空闲)。

中断系统提供的接口如下:

IntStatusSetLevelIntStatuslevel//开/关中断MachineStatusgetStatusreturnstatusvoidsetStatusMachineStatusststatusst读/写机器状态Interrupt:

:

ScheduleCallBackObjtoCallintfromNowIntTypetype生成一个中断放入中断队列和Interrupt类密切相关的是PendingInterrupt类,它的构造函数如下PendingInterrupt:

:

PendingInterruptCallBackObjcallOnIntinttimeIntTypekindcallOnInterruptcallOnIntwhentimetypekind它的作用是生成一个即将发生的中断,其中callOnInt指出了中中断发生时需要调用的虚拟硬件,when指出了中断发生的时间,type指出中断类型。

Interrupt类还有一个数据结构SortedListltPendingInterruptgtpending它是一个中断等待队列,记录了即将发生的中断,Nachos的中断在两个时刻被处理当机器时钟前进时和系统处于Idle时,两个中断处理的过程分别如图1.2和图1.3所示,山东科技大学信息学院eagle_关中断中断队列为空否取出队列中一个中断并调用其处理函数处理中断开中断是需要contextswitchcontextswitch是否结束图1.2关中断中断队列为空否取出队列中一个中断并调用其处理函数处理中断开中断是调整系统时间至第一个等待中断要发生的时间退出系统有其它中断是否结束图1.3这样,以中断系统为基础,加上指令解释,就可以实现进程管理、文件系统管理、虚拟内存、用户程序和网络管理等所有操作系统功能,图1.4展示了Nachos系统的整体结构。

图1.4在Nachos中时钟中断还担负了进程调度的任务,因此对时钟类Timer进行分析。

该模块的作用是模拟时钟中断。

Nachos虚拟机可以如同实际的硬件一样,每隔一定的时间会发生一次时钟中断。

如果运行Nachos时指定-rs参数启动时钟中断,在每次的时钟中断处理的最后就会进行线程的切换。

但是正如概述中提到的,这种进程调度是不完山东科技大学信息学院eagle_善的,如果系统就绪进程不止一个的话,每次时钟中断都一定会发生进程的切换。

所以运行Nachos时,如果以同样的方式提交进程,系统的结果将是一样的。

这不符合操作系统的运行不确定性的特性。

所以在模拟时钟中断的时候,加入了一个随机因子,如果该因子设置的话,时钟中断发生的时机将在一定范围内是随机的。

这样有些用户程序在同步方面的错误就比较容易发现。

但是这样的时钟中断和真正操作系统中的时钟中断将有不同的含义。

不能象真正的操作系统那样通过时钟中断来计算时间等等。

是否需要随机时钟中断可以通过设置选项-rs来实现。

33.1NachosNachos广泛采用线程的概念,线程是Nachos处理机调度的单位,在Nachos中线程分成两类,一类是系统线程,只运行核心代码的线程,它运行在核心态下,并且占用宿主机的资源,系统线程共享Nachos操作系统本身的正文段和数据段。

Nachos的另一类线程同Nachos中的用户进程有关。

Nachos中用户进程由两部分组成,核心代码部分和用户程序部分。

每当系统接收到生成用户进程的请求时,首先生成一个系统线程,该线程的作用是给用户程序分配虚拟机内存空间,并把用户程序的代码段和数据段装入用户地址空间,然后调用解释器解释执行用户程序;由于Nachos模拟的是一个单机环境,多个用户进程会竞争使用Nachos唯一的处理机资源,所以在Nachos用户进程的进程控制块中增加有虚拟机运行现场空间以及进程的地址空间指针等内容,保证用户进程在虚拟机上的正常运行。

在图2.1中可以看出,系统线程竞争使用宿主机的CPU资源,而用户进程的用户程序部分竞争使用的是虚拟机的CPU和寄存器。

所以用户进程在被切换下处理机时,需要保存其系统线程部分的现场,同时还需要保存虚拟机部分的现场。

系统线程系统线程系统线程系统线程用户程序用户进程系统线程用户程序系统线程用户程序图2.1山东科技大学信息学院eagle_Nachos中的进程有以下几个部分构成,Addressspace(地址空间),包括进程可以访问的所有内存空间,为进程所独占,只有内核线程会共享系统的代码段和数据段,用户线程之间不会有课本上讲的那种共享块,但是用户线程的核心部分依然共享系统的资源。

地址空间进一步可以被细分为可执行代码、堆和栈。

主线程和所有的子线程共享进程的可执行代码部分,但是每个线程都有自己的堆栈空间和寄存器,用于保存运行状态。

Registers寄存器组,包括PC指针、堆栈指针和其它寄存器。

ExecutablecodeHeapStack……..ExecutablecodeHeapStack..线程状态,共有4个状态,如图2.2所示。

JUST_CREATED当刚刚被创建时,线程在构造函数中状态被初始化为JUST_CREATED;JUST_CREATED—〉READY进程被创建后进入READY状态等待分配处理机资源;READY—〉RUNNING得到处理机资源后进程转至RUNNING状态运行;RUNNING—〉READY如果允许时钟中断,每次时钟中断发生时,会强制当前运行的进程放弃处理机回到READY状态;RUNNING—〉BLOCKED当需要I/O等操作或者发生了其它产生阻塞的操作(例如信号量的wait)时,进入BLOCKED状态;BLOCKED—〉READY引发阻塞的事件发生后进程返回READY状态。

运行结束后,进程需要释放其占用的机器资源。

由于Nachos中没有相关守护进程,因此进程结束时仅仅是用一个Thread类型的指针ToBeDestoryed指向自身,下一个得到处理机的进程将检测ToBeDestoryed,如果不为空,则进行资源的回收工作。

而且,Nachos中只有一个记录等待状态进程的队列ReadyList,没有数据结构去维护全部进程,处于其它状态的进程全部游离在系统中。

当等待队列为空时,系统转入Idle状态,如果此时也没有将要发生的中断,则系统将退出。

这里有一个BUG,因为ReadyList为空时,并不代表系统中已经没有了需要处理的进程,系统将有可能错误地推出而不被检测出来。

Process1Process2图2.2山东科技大学信息学院eagle_Nachos的线程通过Thread类来实现,Thread类的属性定义如下:

enumThreadStatusJUST_CREATEDRUNNINGREADYBLOCKED定义线程状态intstackTop栈顶指针voidmachineStateMachineStateSize虚拟机寄存器组,用于内核线程,保存运行时的寄存器值ThreadStatusstatus线程状态intuserRegistersNumTotalRegs用户寄存器组,用于用户线程AddrSpacespace线程地址空间对线程的主要操作方法如下:

voidThread:

:

ForkVoidFunctionPtrfuncvoidargInterruptinterruptkernel-gtinterruptSchedulerschedulerkernel-gtschedulerIntStatusoldLevelStackAllocatefuncargoldLevelinterrupt-gtSetLevelIntOffscheduler-gtReadyToRunthisvoidinterrupt-gtSetLeveloldLevel主要功能:

在初始化之后将线程设置为可运行的并等待处理机。

实现方法:

1.设置新线程共享Nachos的代码段和数据段2.为新线程分配私有的栈空间3.关中断初启态就绪态运行态阻塞态处理机调度运行被迫放弃处理机初始化结束等待某事件发生等待的事件发生运行结束图2.3山东科技大学信息学院eagle_4.新线程插入等待队列5.开中断VoidThread:

:

YieldThreadnextThreadIntStatusoldLevelkernel-gtinterrupt-gtSetLevelIntOffASSERTthiskernel-gtcurrentThreadDEBUGdbgThreadquotYieldingthread:

quotltltnamenextThreadkernel-gtscheduler-gtFindNextToRunifnextThreadNULLkernel-gtscheduler-gtReadyToRunthiskernel-gtscheduler-gtRunnextThreadFALSEvoidkernel-gtinterrupt-gtSetLeveloldLevel主要功能:

强制主调线程放弃处理机并切换到下一个进程。

实现方法:

关中断当前进程正在运行是中断队列为空取出队首进程否将当前进程放入等待队列运行取出的进程开中断否报错退出结束VoidThread:

:

SleepboolfinishingThreadnextThread山东科技大学信息学院eagle_ASSERTthiskernel-gtcurrentThreadASSERTkernel-gtinterrupt-gtgetLevelIntOffDEBUGdbgThreadquotSleepingthread:

quotltltnamestatusBLOCKEDwhilenextThreadkernel-gtscheduler-gtFindNextToRunNULLkernel-gtinterrupt-gtIdle//noonetorunwaitforaninterrupt//returnswhenitstimeforustorunkernel-gtscheduler-gtRunnextThreadfinishing主要功能:

线程由于某种原因进入阻塞状态等待一个事件的发生(信号量的V操作、开锁或者条件变量的设置)。

当这些条件得到满足,该线程恢复就绪状态。

实现方法:

设置进程状态为BLOCKED等待队列为空取出队首进程并运行否运行取出的进程系统进入IDLE状态是结束3.2Nachos借助于宿主机的contextswitch实现这一部分的功能,由于需要直接访问宿主机的寄存器,这部分代码采用汇编语言实现。

在Nachos的threads文件夹下有一个名为switch.s的汇编文件,Nachos可以运行如DECMIPS、ALPHA、SPARC、PARISC、x86、PowerPC的在多种机器上,不同机器的寄存器数目和作用不一定相同,所以针对不同的机器switch.s中进行了不同的处理。

如果需要将Nachos移植到其它机器上,就需要修改这部分的内容。

但是不论是哪一种机器,Nachos都为其定义了两个函数,ThreadRoot和SWITCH,ThreadRoot在线程第一次被切换入处理机时由SWITCH函数调用,声明如下:

ThreadRootInitialPCInitialArgWhenDonePCStartupPCInitialPC指向线程的入口函数地址,InitialArg指向入口函数的唯一参数,山东科技大学信息学院eagle_WhenDonePC指向线程结束时需要调用的函数地址在这里为Thread:

:

Finish,StartupPC指向线程的初始化函数地址,在这里为中断允许操作。

在Thread类的StackAllocate函数中的如下代码初始化了这几个指针的值。

machineStatePCStatevoidThreadRootmachineStateStartupPCStatevoidThreadBeginmachineStateInitialPCStatevoidfuncmachineStateInitialArgStatevoidargmachineStateWhenDonePCStatevoidThreadFinishStackAllocate同时设置PC指针,把ThreadRoot的入口地址赋给SWITCH函数的返回地址,以保证第一次切换该线程时ThreadRoot函数会被调用,X86部分的赋值代码如下ifdefx86stackTopstackStackSize-4//-4tobeonthesafeside--stackTopintThreadRootstackSTACK_FENCEPOSTendifThreadRoot函数依次执行StartupPC、InitialPC和WhenDonePC,实现线程的运行。

函数的X86部分有如下代码实现这部分功能:

ThreadRoot:

pushlebpmovlespebppushlInitialArgcallStartupPCcallInitialPCcallWhenDonePC/NOTREACHED/movlebpesppoplebpretSWITCH函数的声明如下:

SWITCHoldThreadnewThread它在Scheduler类(实现CPU调度,分析见4.CPU调度)的Run函数中被调用,使运行的线程由oldThread转为newThread。

切换流程如下:

山东科技大学信息学院eagle_保存oldThread的运行状态设置返回地址装入newThread的运行状态设置返回地址在newThread的栈空间上运行返回4.CPUNachos中CPU调度在Schedular类中实现,同实际操作系统不同的是,调度的直接对象是线程,而不是以进程为单位。

其最重要的一个数据结构是一个等待队列,定义如下:

ListltThreadgtReadyList在这里它被当作一个FIFO的队列使用,每次调度时将当前线程放入队尾并vong对首取出将要运行的线程。

因此,Nachos仅仅实现了先进先出的简单调度,由方法FindNextToR

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1