1、操作系统原理课程设计实验手册操作系统原理课程设计实验手册2010年4月第一章 试验环境介绍一.1 引言操作系统上机实践环节是操作系统课程的重要组成部分,对于理解操作系统课程中的相关理论和知识点有着非常重要的作用。为帮助学生更好的完成上机实践作业,特编写此基于Nachos平台的操作系统上机实践指南。一.2 Nachos平台的功能特点简介1.2.1 什么是NachosNachos的全称是“Not Another Completely Heuristic Operating System”,它是一个可修改和跟踪的操作系统教学软件。它给出了一个支持多线程和虚拟存储的操作系统骨架,可让学生在较短的时间内
2、对操作系统中的基本原理和核心算法有一个全面和完整的了解。1.2.2 Nachos的特点功能介绍在本科的操作系统教学中,能够提供一个展示真实操作系统是如何工作的工程环境是很重要的,但同时也要求这个工程环境便于学生的理解和修改,所以我们采用Nachos作为操作系统课程的教学实践平台。Nachos是美国加州大学伯克莱分校在操作系统课程中已多次使用的操作系统课程设计平台,在美国很多大学中得到了应用,它在操作系统教学方面具有以下几个突出的优点: 采用通用虚拟机Nachos是建立在一个软件模拟的虚拟机之上的,模拟了MIPS R2/3000的指令集、主存、中断系统、网络以及磁盘系统等操作系统所必须的硬件系统
3、。许多现代操作系统大多是先在用软件模拟的硬件上建立并调试,最后才在真正的硬件上运行。用软件模拟硬件的可靠性比真实硬件高得多,不会因为硬件故障而导致系统出错,便于调试。虚拟机可以在运行时报告详尽的出错信息,更重要的是采用虚拟机使Nachos的移植变得非常容易,在不同机器上移植Nachos,只需对虚拟机部分作移植即可。采用R2/3000指令集的原因是该指令集为RISC指令集,其指令数目比较少。Nachos虚拟机模拟了其中的63条指令。由于R2/3000指令集是一个比较常用的指令集,许多现有的编译器如gc+能够直接将C或C+源程序编译成该指令集的目标代码,于是就不必编写编译器,读者就可以直接用C/C
4、+语言编写应用程序,使得在Nachos上开发大型的应用程序也成为可能。 使用并实现了操作系统中的一些新的概念随着计算机技术和操作系统技术的不断发展,产生了很多新的概念。Nachos将这些新概念融入操作系统教学中,包括网络、线程和分布式应用。而且Nachos以线程作为一个基本概念讲述,取代了进程在以前操作系统教学中的地位。Nachos的虚拟机使得网络的实现相当简单。与MINIX不同,Nachos只是一个在宿主机上运行的一个进程。在同一个宿主机上可以运行多个Nachos进程,各个进程可以相互通讯,作为一个全互连网络的一个节点;进程之间通过Socket进行通讯,模拟了一个全互连网络。 确定性调试比较
5、方便,随机因素使系统运行更加真实因为操作系统的不确定性,所以在一个实际的系统中进行多线程调试是比较困难的。由于Nachos是在宿主机上运行的进程,它提供了确定性调试的手段。所谓确定性调试,就是在同样的输入顺序、输入参数的情况下,Nachos运行的结果是完全一样的。在多线程调试中,可以将注意力集中在某一个实际问题上,而不受操作系统不确定性的干扰。另外,不确定性是操作系统所必须具有的特征,Nachos采用了随机因子模拟了真实操作系统的不确定性。 简单而易于扩展Nachos是一个教学用操作系统平台,它必须简单而且有一定的扩展余地。Nachos不是向读者展示一个成功的操作系统,而是让读者在一个框架下发
6、挥自己的创造性进行扩展。例如一个完整的类似于UNIX的文件系统是很复杂的,但是对于文件系统来说,无非是需要实现文件的逻辑地址到物理地址的映射以及实现文件inode、打开文件结构、线程打开文件表等重要的数据结构以及维护它们之间的关系。Nachos中具有所有这些内容,但是在很多方面作了一定的限制,比如只有一级索引结构限制了系统中最大文件的大小。读者可以应用学到的各种知识对文件系统进行扩展,逐步消除这些限制。Nachos在每一部分给出很多课程作业,作为读者进行系统扩展的提示和检查对系统扩展的结果。 面向对象性Nachos的主体是用C+的一个子集来实现的。目前面向对象语言日渐流行,它能够清楚地描述操作
7、系统各个部分的接口。Nachos没有用到面向对象语言的所有特征,如继承性、多态性等,所以它的代码就更容易阅读和理解。Nachos共有五个功能模块,分别是机器模拟、线程管理、文件系统管理、用户程序和虚拟存储以及网络系统。它们的具体实现会在第二章中进行详细介绍。一.3 Nachos平台的搭建与配置一.3.1 Nachos试验环境文件列表在我们的教学网站可以下载到搭建nachos试验平台的所有软件,下面就将搭建nachos试验环境所需的软件作一个简要的描述:NachOS-4.1_110.gz:nachos的源代码压缩包,在linux下可以用gzip、tar解开,在windows下直接使用winrar
8、就可解压开。mips-decstation.linux-xgcc.tar.gz:nachos的交叉编译工具,在linux下可以用gzip、tar解开,在windows下直接使用winrar就可解压开。Si35Setup.rar:Windows下的源代码编辑查看工具。vmware-5.5.1.rar:Vmware虚拟机软件的安装程序,运行它就可以在我们的Windows安装上vmware。Vmwar可以在一个物理机器上模拟出虚拟的硬件机器,进而我们就可以在这些虚拟的硬件机器上安装我们的操作系统了。(详细使用参见后面的试验环境搭建)一.3.2 Nachos试验环境搭建步骤Nachos最初由美国加州大
9、学伯克利分校为其操作系统课程的教学实习而开发。这个操作系统一开始就设计成只能在unix like 的操作系统下运行,并没有针对windows平台的移植。有鉴于国内教学实习中普遍使用windows平台,所以我们需要通过安装虚拟机软件,创建linux虚拟机来最终实现我们的nachos代码的编译运行。下面我们将通过几个步骤来具体的描述nachos试验环境的搭建。一.3.2.1 Vmware的安装Vmware是一个虚拟机软件,它可以在windows平台上虚拟出真实机器的硬件环境的,使得我们可以在不购买新机器的情况下就可以在一个机器上运行多个操作系统。Vmware的安装和普通的windows应用程序安装
10、没有太大的差别,是一个相当“傻瓜”的过程,只要按照提示,依次点击“下一步”就可顺利地完成vmware的安装了。一.3.2.2 虚拟机的创建这一步的主要任务就是要告诉vmware我们想要虚拟什么样的硬件机器。下面将以图示的方式一步步地讲解虚拟机的创建:启动vmware程序点击如图1-1所示的菜单图1-1 VMWare程序启动或是点击home-tab上的new virtural machine(如图1-2)就可开始虚拟机的创建过程。图1-2 VMWare程序启动(二)在接下来的对话框中选择定制创建虚拟机点击下一步按钮(如图1-3)图1-3 定制虚拟机在接下来的虚拟机格式中选择系统默认的new-wo
11、rkstation5格式即可,这样我们可以获得一些好处比如可以抓图,但是也有一些坏处那就是创建的虚拟机文件不能在老版本的vmware上打开。点击下一步后出现选择操作系统类型对话框,我们只要选择linuxredhat linux就行了。点击下一步,弹出的对话框要求我们回答虚拟机名称和虚拟机文件安放的路径,只要根据自己的情况回答就行了。(如图1-4)图 1-4 选择虚拟机名称和安放路径点击下一步后弹出内存设定对话框,这个对话框是要回答vmware需要给我们的虚拟机器模拟多大的内存,在我们的实验环境中256M已经足够了。(如图1-5)图1-5 虚拟机定制内存点击下一步,就进入了网络选择对话框,在我们
12、的试验环境中选择最后一项“不使用网络”就可以了。(如图1-6)图1-6 虚拟机网络设置点击下一步,进入选择I/O适配器类型,这一步不需要我们干预接受默认值,点击下一步就可以了。(如图1-7)图1-7 网络适配器设置接下来就进入了硬盘创建的步骤了,选择创建IDE的硬盘,系统就会弹出对话框,要求回答硬盘的大小,在我们的试验环境中有4G大小就足够了。(按图1-8,1-9,1-10)图1-8 创建虚拟磁盘图1-9 选择磁盘种类图1-10 选择磁盘大小点击下一步后,虚拟机的创建就到了最后一个步骤回答硬盘文件的名称,根据自己的情况回答这个名称点击完成,整个虚拟机的创建过程就结束了。(如图1-11)图1-1
13、1 指定硬盘文件名称虚拟机创建完成后vmware 的主窗口就会多出一个标签页,这页的内容正式我们所创建的虚拟机的信息。(如图1-12)图1-12 新建虚拟机信息点击标签页上的“start this virtual machine”就可以启动我们刚刚创建的虚拟机,但是由于我们只是让vmware帮我们模拟出了一个硬件机器,我们还没有向这个机器上安装任何软件,所以我们的机器运行后除了一些BIOS程序的输出外别的什么也没有,也什么都不能干,所以我们需要进行下一步,向虚拟机上安装OS和应用程序。1.3.2.3 虚拟机上linux的安装 虚拟机创建好了,vmware只是按照我们的要求模拟出了一个硬件机器,
14、到目前位置这个虚拟机上并没有安装任何软件,也不能做任何事情。这一步的目的就是要向虚拟的硬件机器上安装linux操作系统,进而安装其他应用程序。 在虚拟机上安装linux和在真实机器上由光驱安装linux是相同的过程。首先需要把安装光盘放到光驱中,双击主界面上的CD-ROM,弹出如图1-13对话框:图1-13 CD-ROM对话框如果你有光驱,也有linux的安装光盘就可以选择“Use physical drive”;如果有linux的ISO映象,就需要选“Use ISO image”,并且指定好映像的位置。安装光盘设置好后我们就可以启动虚拟机器进行安装了。机器正常从光驱启动就会出现如图1-14的
15、画面:图1-14 安装Linux启动画面只有鼠标点击vmware的窗口之后,所有的鼠标和键盘输入才能定向到虚拟机我们是新安装linux并且使用图形界面安装过程,所以这时我们只要敲“Enter”就可以开始安装过程了。Ctrl+Alt是vmware的热键,如果想将鼠标从vmware的环境回到windows下,就可以使用这个热键;如果要从全屏方式回到窗口方式,也需要点击这个热键安装过程其实是很简单的大多情况下只要点击“next”按钮就可以了,下面仅就比较关键的步骤进行一下描述:图1-15 定制安装Linux在上图1-15所使得步骤中,最好是选择定制安装,这样我们可以对安装过程进行控制,安装我们所需要
16、的东西。在接下来的步骤中我们将会遇到如下的画面,它让我们选择怎样的分区方式,我们只要按照如图所示选择系统自动分区就行了,系统自动分区的结果还是比较合理的。(如图1-16)图1-16选择分区方式接下来的若干步只要点击“next”就行了,其中有的步骤询问是否要删除磁盘上的数据这是只要回答“Yes”就行了,我们是新装操作系统,磁盘上没有什么有用的数据,也不用担心本机的数据会丢失,VMWare操作的只是它的磁盘文件的数据,不会对本机造成任何伤害。当安装程序如下图所示要求我们回答root密码时我们就要按照自己的情况回答这个密码,但是一定要记住,因为这个密码是超级用户的密码,对于系统特别重要。(如图1-1
17、7)接下来的几步仍然只需要“next”直到包的选择步骤:(如图1-18)图1-17 设置超级用户密码图1-18软件包的选择我们只需要按照自己的需要选择自己所需要的包就可以了,包选择的多了最后的虚拟机磁盘的使用量就自然会大一些。我们必须选择software development包,因为它会为我们安装编译调试工具,这是我们编译nachos系统所需要的接下来的步骤就基本不用回答什么问题了只要一路“next”下去就行了。安装后虚拟机顺利重启,经过一个不太长的启动过程我们就可以看到登录界面,那么我们的安装过程就算是成功完成了。虚拟机重启的时候不要忘记点击F2进入BIOS设置画面,将启动顺序变为从硬盘启
18、动,这样我们启动的速度能加快一点一.3.2.3 虚拟机和本机之间的数据传递 设windows主机的ip地址为x.y.z.w,在windows下共享一个目录nachos,设共享名为nachos,建立用户zk具有完全访问权限,密码为:abcd。 Linux下通过samba进行访问。mkdir /progsmbmount /192.168.0.200/nachos /prog o username=zk输入密码:abcd/prog变为工作目录。Linux下的命令和文件命是区分大小写的,在windows命令提示符下是不区分大小写的一.3.2.4 Si35Setup.rar的安装 虽然在linux我们可
19、以高效地完成所有开发所需的任务,但是对于刚刚开始接触unix/linux的同学,一下子用熟那么多的工具还是有些困难的。正是基于这一点我们的教学网站上也提供了在windows下用来阅读代码的工具Source Insight,借助于它我们可以加快代码阅读速度。这个软件的安装是个很简单的过程只要运行setup一路next下去就可以了。代码阅读时要先建工程,点击projectnew project,然后按照要求回答源代码的位置,工程就会顺利的建成。代码阅读时如果需要一些功能比如想要查找某个符号的定义只要在选定的符号上点右键就会弹出菜单,选择相应的命令就可以了。一.3.3 Nachos的功能模块组成结构
20、编译后的nachos在我们的linux操作系统中,只相当于一个普通的程序,运行起来就是一个普通的进程。另一方面它又是一个不普通的程序,他是完全按照操作系统思想而开发出的一个操作系统内核。它的结构就是一个完整的操作系统结构。下图标出了nachos操作系统的结构。图1-20 nachos系统结构一.3.4 Nachos的编译运行开发环境nachos虽说是一个操作系统但是他在linux下运行,也就相当与linux的一个普通进程,所以nachos的编译、调试、运行和一般的linux程序的调试连接运行是没有什么两样的。下面我们就从编辑、编译、编辑、代码阅读等方面对linux下的程序开发环境做一下阐述:
21、程序编辑用Source Insight编辑。 程序编译在linux下的nachos代码是借助make工具来实现编译连接的。make工具是一个工程管理工具,make是根据Makefile的指示来完成所有工作的。Nachos的每个零部件的代码中都包含一个Makefie文件,所以我们在修改nachos代码后直接使用make命令就可以编译连接我们的程序了,而不再需要其他额外的工作。 程序调试在linux下调试我们一般使用gdb作为调试工具。gdb使用过程大致如下:启动gdb: gdb gdb启动后就进入了gdb的使用file命令加载要调试的可执行程序:file nachos断点设置: break ma
22、in 在main函数上设置断点程序运行一步:next next命令不跟到函数里面去 程序跟进: step step命令可以跟跟到函数里面去 显示变量的值: print temp temp是变量命,这个命令将显示temp的值 显示源代码: list 这个命令可以列出所调试程序的源代码gdb是一个很强大的调试工具,这里我们只列出了我们平时用的几个简单的命令,更复杂的使用可以参照gdb的手册或是联机文档。第二章 Nachos平台技术实现说明二.1 Nachos的机器模拟机制概述二.1.1 Sysdep模块实现机制分析本模块主要在文件sysdep.cc和sysdep.h中实现。Nachos的运行环境可
23、以是多种操作系统,由于每种操作系统所提供的系统调用或函数调用在形式和内容上可能有细微的差别。sysdep模块的作用是屏蔽掉这些差别。下面就主要的函数功能进行一下说明: PoolFile 函数语法: bool PoolFile (int fd)参数: fd:文件描述符,也可以是一个套接字 (socket)功能:测试一个打开文件fd是否有内容可以读,如果有则返回TRUE,否则返回FALSE。当Nachos系统处于IDLE状态时,测试过程有一个延时,也就是在一定时间范围内如果有内容可读的话,同样返回TRUE。 OpenForWrite 函数语法: int OpenForWrite (char *na
24、me)参数: name:文件名功能:为写操作打开一个文件。如果该文件不存在,产生该文件;如果该文件已经存在,则将该文件原有的内容删除。 OpenForReadWrite 函数语法: int OpenForReadWrite (char *name, bool crashOnError)参数: name::文件名;crashOnError: crash 标志功能: 为读写操作打开一个文件。当 crashOnError 标志设置而文件不能读写打开时,系统出错退出。 Read 函数语法: void Read (int fd, char *buffer, int nBytes)参数: fd:打开文件描
25、述符;buffer:读取内容的缓冲区;nBytes:需要读取的字节数功能: 从一个打开文件fd 中读取nBytes 的内容到buffer 缓冲区。如果读取失败,系统退出。注意:这和系统调用read 不完全一样。read 系统调用返回的是实际读出的字节数,而Read 函数则必须读出nBytes,否则系统将退出。如果需要使用同read 系统调用相对应的函数,请用ReadPartial。 ReadPartial 函数语法: int ReadPartial (int fd, char *buffer, int nBytes)参数: fd:打开文件描述符;buffer:读取内容的缓冲区;nBytes:
26、需要读取的最大字节数功能: 从一个打开文件fd 中读取nBytes 的内容到buffer 缓冲区。 WriteFile 函数语法: void WriteFile (int fd, char *buffer, int nBytes)参数: fd:打开文件描述符;buffer:需要写的内容所在的缓冲区;nBytes: 需要写的内容最大字节数功能: 将buffer 缓冲区中的内容写nBytes 到一个打开文件fd 中。注意:这和系统调用write 不完全一样。write 系统调用返回的是实际写入的字节数,而WriteFile 函数则必须写入nBytes,否则系统将退出。 Lseek 函数语法: vo
27、id Lseek (int fd, int offset, int whence)参数: fd:文件描述符;offset:偏移量;whence: 指针移动的起始点功能: 移动一个打开文件的读写指针,含义同lseek 系统调用;出错则退出系统。 Tell 函数语法: int Tell (int fd)参数: fd:文件描述符功能: 指出当前读写指针位置 Close 函数语法: void Close (int fd)参数: fd:文件描述符功能: 关闭当前打开文件fd,如果出错则退出系统。 Unlink 函数语法: bool Unlink (char *name)参数: name:文件名功能: 删
28、除文件。 OpenSocket 函数语法: int OpenSocket ()参数: 无功能: 申请一个socket。 CloseSocket 函数语法: void CloseSocket (int sockID)参数: sockID:socket 标识功能: 释放一个socket。 AssignNameToSocket 函数语法: void AssignNameToSocket(char *socketName, int sockID)参数: socketName:socket文件名;sockID:socket标识功能: 将一个文件名和一个socket 标识联系起来,于是将一个SOCKET
29、文件同一个Nachos进程连接起来,使宿主机上该Nachos 进程成为一个网络节点。 DeAssignNameToSocket 函数语法: void DeAssignNameToSocket(char *socketName)参数: socketName::socket 文件名功能: 将一个文件名删除,实际上是和相应的socket 标识脱离关系。 PoolSocket 函数语法: bool PoolSocket (int sockID)参数: socketID:socket 标识功能: 查询一个socket 是否有内容可以读取。 ReadFromSocket 函数语法: void ReadFr
30、omSocket (int sockID, char *buffer, int packetSize)参数: socketID:socket 标识;buffer:读取内容的暂存空间;packetSize:读取数据包的大小功能: 从一个socket 标识中读取packetSize 大小的数据包,放在buffer 缓冲中。 SendToSocket 函数语法: void SendToSocket (int sockID, char *buffer, int packetSize, char *toName)参数: socketID:socket 标识;buffer:发送内容的暂存空间;packet
31、Size:发送数据包的大小;toName:要接收数据包的Nachos 虚拟机模拟网络文件的文件名功能: 向socket 标识中发送packetSize 大小的数据包。 CallOnUserAbort 函数语法: void CallOnUserAbort (VoidNoArgFunctionPtr func)参数: func:函数指针功能: 设定一个函数,在用户强制退出系统时调用。 Delay 函数语法: void Delay (int seconds)参数: seconds:需要延迟的秒数功能: 系统延迟一定的时间。 Abort 函数语法: void Abort ()参数: 无功能: 退出系统 (非正常退出)。 Exit 函数语法: void Exit (int exitCode)参数: exitCod:向系统的返回值功能: 退出系统。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1