操作系统课程设计报告NachOSexperimentsreport.doc

上传人:文库蛋蛋多 文档编号:3243041 上传时间:2023-03-12 格式:DOC 页数:56 大小:2.06MB
返回 下载 相关 举报
操作系统课程设计报告NachOSexperimentsreport.doc_第1页
第1页 / 共56页
操作系统课程设计报告NachOSexperimentsreport.doc_第2页
第2页 / 共56页
操作系统课程设计报告NachOSexperimentsreport.doc_第3页
第3页 / 共56页
操作系统课程设计报告NachOSexperimentsreport.doc_第4页
第4页 / 共56页
操作系统课程设计报告NachOSexperimentsreport.doc_第5页
第5页 / 共56页
点击查看更多>>
资源描述

《操作系统课程设计报告NachOSexperimentsreport.doc》由会员分享,可在线阅读,更多相关《操作系统课程设计报告NachOSexperimentsreport.doc(56页珍藏版)》请在三一办公上搜索。

1、四 川 大 学操作系统课程设计报告学 院: 软 件 学 院 专 业: 软 件 工 程 年 级: 08 级 组 成 员: 提交时间: 2010年6月24日 指导教师评阅意见: . . . . . 实验项目一项目名称:在 Nachos 上开发一个 shell实验目的:本实践项目希望通过修改 Nachos 系统平台的底层源代码来实现以下目标: 1. 为 Nachos 实现一个 Shell (字符终端)界面,通过该界面,用户可以实现类似于 Linux Shell 的大部分功能; 2. Shell 界面上以“ - ”作为 Shell 命令输入提示符,输入命令后以“ ENTER ”作为输入结束键。试验背景

2、知识操作系统的重要的功能之一就是在用户和计算机硬件之间提供界面,向用户屏蔽底层的硬件细节,为用户提供交互的接口。界面大致可分为两类,一类是字符终端界面,比如 Linux 、 Unix 等操作系统的 Shell , Microsoft Windows 的 Dos 环境等;另一类是图形界面,比如 Linux 、 Unix 的 XWindows 和 Microsoft Windows 的桌面管理系统等。 Nachos 平台既没有提供字符终端界面,也没有提供图形界面, Nacos 对运行于其上的程序以“ Nachos -x Program ”的方式运行,与实际的操作系统使用体验有较大的差距。文字操作系

3、统与外部最主要的接口就叫做shell。shell是操作系统最外面的一层。shell管理你与操作系统之间的交互:等待你输入,向操作系统解释你的输入,并且处理各种各样的操作系统的输出结果。 shell提供了你与操作系统之间通讯的方式。这种通讯可以以交互方式(从键盘输入,并且可以立即得到响应),或者以shell script(非交互)方式执行。shell script是放在文件中的一串shell和操作系统命令,它们可以被重复使用。本质上,shell script是命令行命令简单的组合到一个文件里面。 Shell基本上是一个命令解释器,类似于DOS下的。它接收用户命令(如ls等),然后调用相应的应用程

4、序。较为通用的shell有标准的Bourne shell (sh)和C shell (csh)。 交互式shell和非交互式shell 交互式模式就是shell等待你的输入,并且执行你提交的命令。这种模式被称作交互式是因为shell与用户进行交互。这种模式也是大多数用户非常熟悉的:登录、执行一些命令、签退。当你签退后,shell也终止了。 shell也可以运行在另外一种模式:非交互式模式。在这种模式下,shell不与你进行交互,而是读取存放在文件中的命令,并且执行它们。当它读到文件的结尾,shell也就终止了。 参与人员及分工: 韩 茂:编写报告,测试,平台搭建 周博鑫:平台搭建,整合代码 赖

5、 锋:代码编写,查资料 吕少飞:代码编写,查资料实验环境:Redhat Linux 9.0 NachOS-4.1环境搭建:实验的开发环境是基于Windows内的虚拟机软件安装的Red Hat Linux 9.0系统来搭建的,本组所使用的虚拟机软件为VMware-workstation-full-7.0.1-227600汉化版,由于此软件的安装无需太多的的设置,故在此省去其安装过程的介绍,直接以Red Hat Linux 9.0的安装开始。以下为虚拟机软件启动后的初始截图:当开始进入系统安装界面时,会出现以下界面,用户直接敲击Enter即可;大概经过一两分钟后,会进入以下起始安装界面,点击“Ne

6、xt”进入下一界面:系统默认安装语言为英文,在此我们选择“简体中文”,然后点击Next”:下一设置界面为键盘和鼠标的设置,我们使用系统默认的设置即可,点击“下一步”:对于安装类型的选择,选择“个人桌面”即可,点击“下一步”:在进行磁盘分区设置时,选择“自动分区”,点击“下一步”:在进行防火墙设置时,注意勾选“eth0”和“SSH”,点击“下一步”:输入至少8位的根用户密码,点击“下一步”:之后系统进入自动安装状态,如下图:安装过程中其会提示更换安装光盘:此时点击虚拟机软件下方的“更换光盘”按钮进行光盘更换即可,安装过程中总共需要进行两次的光盘更换:当安装结束后其会自动重新启动,在重启之后会进入

7、以下界面,选择“否”,点击“下一步”图形化界面的配置,无需更改,点击“下一步”:初始设置界面,点击“前进”:用户账号设置,在输入用户名及密码后,点击“前进”:在提示注册系统时,选择“否”,点击“前进”:之后的设置为一些时区等的设置,由于系统会进行自动检测,故无需进行更改,使用默认设置即可,在此就不一一截图说明。当设置完成后,会进入以下初始登陆界面,输入用户名和密码后登陆系统:以下为进入系统后的界面,至此,整个系统的安装完成:拟机的创建重要的是nachos4.1及其交叉编译工具的安装。1 把nachos4.1下载到/usr/local目录2 tar -zvxf nachos-4.1.tgz3 进

8、入解压后的目录,其中有code子目录,再进入其中的build.linux子目录4 输入 make depend5 输入 make 看看结束有没有错误,如果没有,那么就成功了。编译好的nachos系统镜像就在build.linux目录下,运行时直接 . / nachos 就可以了。如果要到其他目录下运行的话,还要export才行。nachos详细运行参数可以用. / nachos -u 得到。交叉编译工具的搭建。把下载的交叉编译工具放到 / 目录下,即根目录下然后用tar -zvxf 命令解压即可。必须放到根目录下,因为压缩包里面包含了/usr/local的目录层次。另外还需要编译测试程序转换工

9、具,进入 nachos4.1/code/coff2noff运行 . / configuremake 即可。然后在Rat Hat上编译出nachos,其系统结构如下图所示:Si35Setup.rar的安装 虽然在linux我们可以高效地完成所有开发所需的任务,但是对于刚刚开始接触unix/linux的同学,一下子用熟那么多的工具还是有些困难的。正是基于这一点我们的教学网站上也提供了在windows下用来阅读代码的工具Source Insight,借助于它我们可以加快代码阅读速度。这个软件的安装是个很简单的过程只要运行setup一路next下去就可以了。代码阅读时要先建工程,点击projectne

10、w project,然后按照要求回答源代码的位置,工程就会顺利的建成。代码阅读时如果需要一些功能比如想要查找某个符号的定义只要在选定的符号上点右键就会弹出菜单,选择相应的命令就可以了。Nachos的介绍Nachos的全称是“Not Another Completely Heuristic Operating System”,它是一个可修改和跟踪的操作系统教学软件。它给出了一个支持多线程和虚拟存储的操作系统骨架,可让学生在较短的时间内对操作系统中的基本原理和核心算法有一个全面和完整的了解。Nachos的目录结构以上操作系统可以发现在工作目录下生成一个名为nachos-3.4 的目录。该目录中含有

11、:copyright 文件 Nachos 的版权信息readme 文件 Nachos 的readme 信息nachos.ps 文件 Nachos 的介绍文档(Postscript 格式)c+example 目录 有关C+介绍和实例doc 目录 Nachos 各个部分介绍和原有的作业要求code 目录 Nachos 各个部分的源代码最主要的部分是Nachos 的源代码部分。它的目录结构是:MakefileMmonMakefile.dep文件文件文件Nachos 的Makefile 文件。当Nachos 需要移植到其它系统时,可以修改Makefile.dep 中的HOST 参数machine 目录

12、 Nachos 虚拟机模拟部分源代码threads 目录 Nachos 线程管理部分源代码filesys 目录 Nachos 文件系统管理部分源代码userprog 目录 Nachos 用户程序部分源代码network 目录 Nachos 网络管理部分源代码vm 目录 Nachos 虚拟内存管理部分源代码test 目录 一些测试用应用程序bin 目录 包含有用户程序目标码变换的程序三、各个部分的编译运行Nachos的各个部分都可以独立编译运行,也可以同时编译各个部分。全部编译可以采用如下命令:/nachos-3.4$ make当需要单独编译线程管理部分时,先进入threads 目录,然后采用如

13、下命令:/nachos-3.4/threads$ make depend/nachos-3.4/threads$ make nachos实际上,各部分目录下都有一个Makefile 文件,内容大体相同,区别在于一些条件编译的参数。比如在单独编译线程管理部分时,文件管理部分就被屏蔽了,这样读者读者就可以专心于线程管理部分的调试。四、应用程序的编译由于Linux 指令集和R2/3000 指令集不同,用户编写的应用程序用Linux 系统中标准gcc 编译后,不能直接在Nachos 虚拟机环境下运行。所以需要采用交叉编译技术。所谓交叉编译技术是在一个操作系统下将源码编译成另一个操作系统的目标码,这里就

14、是在Linux 下通过gcc 交叉编译版本将用户程序的源码编译成R2/3000 指令集的目标码。在Linux 中,没有缺省的交叉编译工具。读者可以到上海交通大学计算机系FTP 服务器上下载,URL 为:ftp:/该文件的解开需要有超级用户的权利,将解开至/usr/local/目录下:/# gzip -dc cross-compiler.tgz | tar xf -在编译用户程序时,用交叉编译器将源码编译成R2/3000 指令集的目标代码,再经过一个简单的转换就可以在Nachos 虚拟机上运行。注意,在读者实现虚拟存储之前,有些应用程序可能会因为使用过多的内存而不能运行。实验内容:本项目在实践的

15、过程中需要注意以下要点:Shell项目的要求 一、 设计一个简单的命令行shell,满足下面的属性并且可以在指定的UNIX平台下执行。1. 这个shell支持一下内部命令:a) cd把当前默认目录改变为。如果没有参数,则显示当前目录。如果该目录不存在,会出现合适的错误信息。b) cle清屏。c) dir列出目录的内容。d) environ列出所有的环境变量。e) echo在屏幕上显示并且换行(多个空格和制表符可能被缩减为一个空格)。f) help显示用户手册,并且使用more命令过滤。g) pause停止shell操作直到按下回车键。h) quit推出shell。i) shell的环境变量应该

16、包含shell=/myshell,其中/myshell是可以执行的shell完整路径(及shell的可执行路径,而不是他在目录下的硬连接路线)。2. 其他的命令行输入被解释为程序的调用,shell创建并执行折个程序,并作为自己的子进程。程序的执行的环境变量包含在以下条目中:parent=/shell,其中/myshell已经在1.i)中描述过了。3. Shell必须能够从文件中提取命令输入例如shell使用以下命令行被调用:programname arg1 arg2 outputfile这个批处理文件应该包括一组命令集,当到达文件结尾时shell退出。很明显,如果shell被调用是没有使用参数

17、,他会在屏幕上显示提示符请求用户输入。4. Shell必须支持i/o重定向,stdin和stdout,或者其中之一a) 例如命令行:programname arg1 arg2 outputfile使用arg1以及arg2执行程序programname,输入文件流被替换为inputfile,输出文件流被替换为outputfile.b) stdout重定向应该支持一下的内部命令:i. dirii. environiii. echoiv. help以上内部命令已在1中有具体解释,本处比在叙述。使用输出重定向时,如果重定向字符为,则创建输出文件,如果存在则覆盖之;如果重定向字符为,也会创建输出文件,如

18、果存在则添加到文件尾。5. shell必须支持后台程序执行。如果在命令行后面添加&字符,在加载完程序后需要立刻返回命令行的提示符。命令行提示符必须包含当前路径。二、 写一个关于使用如何使用shell的简单的用户手册,用户手册应该包括足够的细节以方便UNIX的初学者简单方便的使用这个shell程序。例如:解释i/o重定向,程序环境以及后台程序执行。用户手册必须命名为readme,必须为一个可以并准文件编辑器可以打开的简单的文档。例如这个描述类型和深度的例子,cah和tcsh的在线帮助(man csh,man tcsh)。这两个shell明显比我们所谓的shell具有更加强大功能。所以用用户手册不

19、一定要非常庞大,也不应包括编译指示即文件列表和源代码,这个用户手册应该面向操作用户,所以台应该是一个操作用手册而不是一个程序员手册。三、 源代码必须有很详细得注释,并且要有很好的组织结构以方便非制作人员的阅读,维护或者修改。结构和注释使程序跟更加易于阅读和理解,并且可以保证批改你的作业的人不用很费劲的去读你的源代码。四、 在提交的源代码文件中,包括:a) 原文件b) makefilec) readme并且这些源代码应该能够编译完成完整的结果。五、 makefile必须产生二进制未见myshell。例如一个makefile例子:#Joe Citizen,s1234567-Operating Sy

20、stems Project 1#CompLab1/01 tutor: Fred Bloggsmyshell:myshell.c utility,c myshell.hgcc-Wall myshell.c utility.c-o myshell在执行命令符键入make就会产生myshell程序。上述makefile从第4行必须以制表符开始。六、 根据上述第6点的实例中,提交的目录中应该包含以下文件:i. makefileii. myshell.ciii. utility.civ. myshell.hv. readme项目说明:可以通过调用Linux下的/bin/sh来实现该项目shell,主要是

21、实现几个nachos系统调用:SysWrite,SysRead,SysExec,SysJoin,SysStrncmp 然后就是在exception.cc中调用这些系统调用 在shell中它们的作用:l SysWrite: 显示提示符与shell的版本信息 l SysRead:读取n个字符到缓存bufferl SysExec 与SysJoin:主要是用来执行命令,如dir 等 。如果该命令不存在则打印错误信息 l SysStrncmp:比较两个字符串的前n个字符, 主要用来判断用户是否输入了exit命令以退出shellNachos中修改的地方:1. syscall.h添加了代码:#define

22、SC_Strncmp 43 int Strncmp(char *buffer,char*str,int size);2. Ksyscall添加的代码:#include #include #include #include #include #include #include #include #include #include #include #include #include #define SHELL /bin/sh int SysWrite(char*buffer ,int size,OpenFileId id) return write(id,buffer,(size_t)size)

23、;int SysRead(char*buffer ,int size,OpenFileId id) return read(id, buffer, (size_t) size);SpaceId SysExec(char* exec_name) pid_t child; child = vfork(); if(child = 0) execl (SHELL, SHELL, -c, exec_name, NULL); _exit (EXIT_FAILURE); else if(child 0) return EPERM; return (SpaceId) child;int SysJoin(Spa

24、ceId id) return waitpid(pid_t) id, (int*) 0, 0);int SysStrncmp(char*buffer,char *str,int n) return strncmp(buffer,str,(size_t)n);3. exception.cccase SC_Write: DEBUG(dbgSys,Write from buffer to consoleOutputmachine-ReadRegister(4)machine-ReadRegister(5)machine-ReadRegister(6)machine-ReadRegister(5);

25、OpenFileId printOut; printOut= (OpenFileId)kernel-machine-ReadRegister(6); int addressOne; addressOne=(int)kernel-machine-ReadRegister(4); int i; i=0;do kernel-machine-ReadMem(addressOne+,1,(int*)&wbufferi+);while(imachine-WriteRegister(2,n1);/* Modify return point */ /* set previous programm counte

26、r (debugging only)*/ kernel-machine-WriteRegister(PrevPCReg, kernel-machine-ReadRegister(PCReg); /* set programm counter to next instruction (all Instructions are 4 byte wide)*/ kernel-machine-WriteRegister(PCReg, kernel-machine-ReadRegister(PCReg) + 4); /* set next programm counter for brach execut

27、ion */ kernel-machine-WriteRegister(NextPCReg, kernel-machine-ReadRegister(PCReg)+4); return;ASSERTNOTREACHED(); break;case SC_Read: DEBUG(dbgSys, read from buffer machine-ReadRegister(4) machine-ReadRegister(5)machine-ReadRegister(6) machine-ReadRegister(5); OpenFileId enterIn; enterIn = (OpenFileI

28、d)kernel-machine-ReadRegister(6); char addressTwo; addressTwo = (char)kernel-machine-ReadRegister(4); int local ; local= (int)kernel-machine-ReadRegister(4); int n2 ; n2= SysRead(&addressTwo,rsize,enterIn); kernel-machine-WriteMem(local,1,(int)addressTwo); kernel-machine-WriteRegister(2,n2); /* Modi

29、fy return point */ /* set previous programm counter (debugging only)*/ kernel-machine-WriteRegister(PrevPCReg, kernel-machine-ReadRegister(PCReg); /* set programm counter to next instruction (all Instructions are 4 byte wide)*/ kernel-machine-WriteRegister(PCReg, kernel-machine-ReadRegister(PCReg) +

30、 4); /* set next programm counter for brach execution */ kernel-machine-WriteRegister(NextPCReg, kernel-machine-ReadRegister(PCReg)+4);return;ASSERTNOTREACHED();break;case SC_Exec: DEBUG(dbgSys,execute a commandmachine-ReadRegister(4)machine-ReadRegister(4); int c; c = 0; do kernel-machine-ReadMem(a

31、ddressThree+,1,(int*)&ebufferc+); while(cmachine-WriteRegister(2,SysExec(ebuffer); /* Modify return point */* set previous programm counter (debugging only)*/ kernel-machine-WriteRegister(PrevPCReg, kernel-machine-ReadRegister(PCReg); /* set programm counter to next instruction (all Instructions are

32、 4 byte wide)*/ kernel-machine-WriteRegister(PCReg, kernel-machine-ReadRegister(PCReg) + 4); /* set next programm counter for brach execution */ kernel-machine-WriteRegister(NextPCReg, kernel-machine-ReadRegister(PCReg)+4);return;ASSERTNOTREACHED();break;case SC_Join: DEBUG(dbgSys,jion machine-ReadR

33、egister(4)machine-WriteRegister(2,SysJoin(SpaceId)kernel-machine-ReadRegister(4); /* Modify return point */ /* set previous programm counter (debugging only)*/ kernel-machine-WriteRegister(PrevPCReg, kernel-machine-ReadRegister(PCReg); /* set programm counter to next instruction (all Instructions ar

34、e 4 byte wide)*/ kernel-machine-WriteRegister(PCReg, kernel-machine-ReadRegister(PCReg) + 4); /* set next programm counter for brach execution */ kernel-machine-WriteRegister(NextPCReg, kernel-machine-ReadRegister(PCReg)+4);Return;ASSERTNOTREACHED();break; case SC_Strncmp: DEBUG(dbgSys, compare two

35、string machine-ReadRegister(4) machine-ReadRegister(5) machine-ReadRegister(6) machine-ReadRegister(4); int addressFive; addressFive = kernel-machine-ReadRegister(5); char str1buffer60; char str2buffer60; int d,e; d= 0; e=0;do kernel-machine-ReadMem(addressFour+,1,(int*)&str1bufferd+); while(dmachin

36、e-ReadMem(addressFive+,1,(int*)&str2buffere+); while(emachine-ReadRegister(6);kernel-machine-WriteRegister(2,n3);/* Modify return point */* set previous programm counter (debugging only)*/ kernel-machine-WriteRegister(PrevPCReg, kernel-machine-ReadRegister(PCReg);/* set programm counter to next inst

37、ruction (all Instructions are 4 byte wide)*/ kernel-machine-WriteRegister(PCReg, kernel-machine-ReadRegister(PCReg) + 4);/* set next programm counter for brach execution */ kernel-machine-WriteRegister(NextPCReg, kernel-machine-ReadRegister(PCReg)+4);return;ASSERTNOTREACHED();break;4. shell.cWrite(

38、n, 21, output);if(Strncmp(buffer,exit,4)=0) Halt(); 5. start.s .globl Strncmp .ent StrncmpStrncmp:addiu $2,$0,SC_Strncmpsyscallj $31.end Strncmp.globl Exit.ent Exit实验结果:执行命令 ./nachos x ./test/shell.noff参考文献:1.操作系统-精髓与设计原理2.Linux内核完全注释3. 操作系统原理课程设计实验手册4.操作系统设计(nachos4.1)5Baidu、Google实验项目二项目名称:Nachos

39、Thread实验目的:n 最多能够同时存在128个用户线程 n 改变为遵循“优先级调度”的抢占式调度 参与人员及分工: 韩 茂:代码编写,查资料 周博鑫:平台搭建,测试 赖 锋:代码编写,查资料 吕少飞:整合代码,编写报告实验背景知识:线程基础知识:线程基本概念:是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程状态:就绪、阻塞和运行三种基本状态。 线程是程序中一个单一的顺序控制流程.在单个程序中同时运行多个线程完成不同的工作,称

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

当前位置:首页 > 教育教学 > 成人教育


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号