NachOS实验报告4个全.docx
- 文档编号:11009229
- 上传时间:2023-02-24
- 格式:DOCX
- 页数:68
- 大小:1.39MB
NachOS实验报告4个全.docx
《NachOS实验报告4个全.docx》由会员分享,可在线阅读,更多相关《NachOS实验报告4个全.docx(68页珍藏版)》请在冰豆网上搜索。
NachOS实验报告4个全
四川大学
操作系统课程设计报告
学院:
软件学院
专业:
软件工程专业
年级:
08级
组编号:
组成员:
提交时间:
2010年6月24日
指导教师评阅意见:
.
..
..
指导教师评阅成绩:
:
:
实验项目一
项目名称:
开发Shell程序
试验背景知识
Shell
此处的shell是指命令行式的shell。
文字操作系统与外部最主要的接口就叫做shell。
shell是操作系统最外面的一层。
shell管理你与操作系统之间的交互:
等待你输入,向操作系统解释你的输入,并且处理各种各样的操作系统的输出结果。
shell提供了你与操作系统之间通讯的方式。
这种通讯可以以交互方式(从键盘输入,并且可以立即得到响应),或者以shellscript(非交互)方式执行。
shellscript是放在文件中的一串shell和操作系统命令,它们可以被重复使用。
本质上,shellscript是命令行命令简单的组合到一个文件里面。
Shell基本上是一个命令解释器,类似于DOS下的。
它接收用户命令(如ls等),然后调用相应的应用程序。
较为通用的shell有标准的Bourneshell(sh)和Cshell(csh)。
交互式shell和非交互式shell
交互式模式就是shell等待你的输入,并且执行你提交的命令。
这种模式被称作交互式是因为shell与用户进行交互。
这种模式也是大多数用户非常熟悉的:
登录、执行一些命令、签退。
当你签退后,shell也终止了。
shell也可以运行在另外一种模式:
非交互式模式。
在这种模式下,shell不与你进行交互,而是读取存放在文件中的命令,并且执行它们。
当它读到文件的结尾,shell也就终止了。
实验目的:
Shell是一个命令处理器(commandprocessor)——是一个读入并解释你输入的命令的程序,它是介于使用者和操作系统之核心程序(kernel)间的一个接口。
它是一个交互性命令解释器。
shell独立于操作系统,这种设计让用户可以灵活选择适合自己的shell。
shell让你在命令行键入命令,经过shell解释后传送给操作系统(内核)执行。
为Nachos实现一个Shell(字符终端)界面,通过该界面,用户可以实现类似于LinuxShell的大部分功能,实现Shell命令的cd,clr,dir,environ,echo
参与人员及分工:
实验环境:
RedhatLinux9.0
NachOS-4.1
>试验环境的搭建:
Vmware的安装,linuxd的安装,sinsight的安装
Vmware的安装
Vmware是一个虚拟机软件,它可以在windows平台上虚拟出真实机器的硬件环境的,使得我们可以在不购买新机器的情况下就可以在一个机器上运行多个操作系统。
Vmware的安装和普通的windows应用程序安装没有太大的差别,是一个相当“傻瓜”的过程,只要按照提示,依次点击“下一步”就可顺利地完成vmware的安装了。
虚拟机的创建
i.
如果所示,在file中选择new——新虚拟机
ii.然后选择定制创建虚拟机——选择操作系统类型(linux-redhatlinux)——虚拟机名称和虚拟机文件安放的路径——虚拟机器模拟内存——网络选择——选择I/O适配器——硬盘创建——设置虚拟机器硬盘名称
如果所示:
定制虚拟机器
操作系统类型以及虚拟机名称和虚拟机文件安放的路径
虚拟机器模拟内存
网络选择
选择I/O适配器
硬盘创建
虚拟机器搭建完成以后,然后安装linux.
虚拟机创建完成后vmware的主窗口就会多出一个标签页,这页的内容正式我们所创建的虚拟机的信息。
(如图1-12)
图1-12新建虚拟机信息
点击标签页上的“startthisvirtualmachine”就可以启动我们刚刚创建的虚拟机,但是由于我们只是让vmware帮我们模拟出了一个硬件机器,我们还没有向这个机器上安装任何软件,所以我们的机器运行后除了一些BIOS程序的输出外别的什么也没有,也什么都不能干,所以我们需要进行下一步,向虚拟机上安装OS和应用程序。
虚拟机上linux的安装
虚拟机创建好了,vmware只是按照我们的要求模拟出了一个硬件机器,到目前位置这个虚拟机上并没有安装任何软件,也不能做任何事情。
这一步的目的就是要向虚拟的硬件机器上安装linux操作系统,进而安装其他应用程序。
在虚拟机上安装linux和在真实机器上由光驱安装linux是相同的过程。
首先需要把安装光盘放到光驱中,双击主界面上的CD-ROM,弹出如图1-13对话框:
图1-13CD-ROM对话框
如果你有光驱,也有linux的安装光盘就可以选择“Usephysicaldrive”;如果有linux的ISO映象,就需要选“UseISOimage”,并且指定好映像的位置。
安装光盘设置好后我们就可以启动虚拟机器进行安装了。
机器正常从光驱启动就会出现如图1-14的画面:
RatHat安装界面
nachos用来分析源码,所以随便你放在linux下面的都可以。
在windows下面直接用winrar就可以解压。
在linux下面用命令tar-zvxfnachos-3.4.1.tar.Z解压。
重要的是nachos4.1及其交叉编译工具的安装。
1把nachos4.1下载到/usr/local目录
2tar-zvxfnachos-4.1.tgz
3进入解压后的目录,其中有code子目录,再进入其中的build.linux子目录
4输入makedepend
5输入make看看结束有没有错误,如果没有,那么就成功了。
编译好的nachos系统镜像就在build.linux目录下,运行时直接./nachos就可以了。
如果要到其他目录下运行的话,还要export才行。
nachos详细运行参数可以用
./nachos-u得到。
交叉编译工具的搭建。
把下载的交叉编译工具放到/目录下,即根目录下然后用tar-zvxf命令解压即可。
必须放到根目录下,因为压缩包里面包含了/usr/local的目录层次。
另外还需要编译测试程序转换工具,进入nachos4.1/code/coff2noff
运行./configure
make即可。
然后在RatHat上编译出nachos,其系统结构如下图所示:
Si35Setup.rar的安装
虽然在linux我们可以高效地完成所有开发所需的任务,但是对于刚刚开始接触unix/linux的同学,一下子用熟那么多的工具还是有些困难的。
正是基于这一点我们的教学网站上也提供了在windows下用来阅读代码的工具SourceInsight,借助于它我们可以加快代码阅读速度。
这个软件的安装是个很简单的过程只要运行setup一路next下去就可以了。
代码阅读时要先建工程,点击project-newproject,然后按照要求回答源代码的位置,工程就会顺利的建成。
代码阅读时如果需要一些功能比如想要查找某个符号的定义只要在选定的符号上点右键就会弹出菜单,选择相应的命令就可以了。
Nachos的介绍
Nachos的全称是“NotAnotherCompletelyHeuristicOperatingSystem”,它是一个可修改和跟踪的操作系统教学软件。
它给出了一个支持多线程和虚拟存储的操作系统骨架,可让学生在较短的时间内对操作系统中的基本原理和核心算法有一个全面和完整的了解。
Nachos的目录结构
以上操作系统可以发现在工作目录下生成一个名为nachos-3.4的目录。
该目录中含有:
copyright文件Nachos的版权信息
readme文件Nachos的readme信息
nachos.ps文件Nachos的介绍文档(Postscript格式)
c++example目录有关C++介绍和实例
doc目录Nachos各个部分介绍和原有的作业要求
code目录Nachos各个部分的源代码
最主要的部分是Nachos的源代码部分。
它的目录结构是:
Makefile
Mmon
Makefile.dep
文件
文件
文件
Nachos的Makefile文件。
当Nachos需要移植到其它系统时,
可以修改Makefile.dep中的HOST参数
machine目录Nachos虚拟机模拟部分源代码
threads目录Nachos线程管理部分源代码
filesys目录Nachos文件系统管理部分源代码
userprog目录Nachos用户程序部分源代码
network目录Nachos网络管理部分源代码
vm目录Nachos虚拟内存管理部分源代码
test目录一些测试用应用程序
bin目录包含有用户程序目标码变换的程序
三、各个部分的编译运行
Nachos的各个部分都可以独立编译运行,也可以同时编译各个部分。
全部编译可以采用如下
命令:
~/nachos-3.4$make
当需要单独编译线程管理部分时,先进入threads目录,然后采用如下命令:
~/nachos-3.4/threads$makedepend
~/nachos-3.4/threads$makenachos
实际上,各部分目录下都有一个Makefile文件,内容大体相同,区别在于一些条件编译的
参数。
比如在单独编译线程管理部分时,文件管理部分就被屏蔽了,这样读者读者就可以专
心于线程管理部分的调试。
四、应用程序的编译
由于Linux指令集和R2/3000指令集不同,用户编写的应用程序用Linux系统中标准gcc编
译后,不能直接在Nachos虚拟机环境下运行。
所以需要采用交叉编译技术。
所谓交叉编译
技术是在一个操作系统下将源码编译成另一个操作系统的目标码,这里就是在Linux下通过
gcc交叉编译版本将用户程序的源码编译成R2/3000指令集的目标码。
在Linux中,没有缺省的交叉编译工具。
读者可以到上海交通大学计算机系FTP服务器上
下载,URL为:
ftp:
//
该文件的解开需要有超级用户的权利,将解开至/usr/local/目录下:
/#gzip-dccross-compiler.tgz|tarxf-
在编译用户程序时,用交叉编译器将源码编译成R2/3000指令集的目标代码,再经过一个简
单的转换就可以在Nachos虚拟机上运行。
注意,在读者实现虚拟存储之前,有些应用程序
可能会因为使用过多的内存而不能运行。
实验内容:
本项目在实践的过程中需要注意以下要点:
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的环境变量应该包含shell=
2.其他的命令行输入被解释为程序的调用,shell创建并执行折个程序,并作为自己的子进程。
程序的执行的环境变量包含在以下条目中:
parent=
3.Shell必须能够从文件中提取命令输入
例如shell使用以下命令行被调用:
programnamearg1arg2
这个批处理文件应该包括一组命令集,当到达文件结尾时shell退出。
很明显,如果shell被调用是没有使用参数,他会在屏幕上显示提示符请求用户输入。
4.Shell必须支持i/o重定向,stdin和stdout,或者其中之一
a)例如命令行:
programnamearg1arg2
使用arg1以及arg2执行程序programname,输入文件流被替换为inputfile,输出文件流被替换为outputfile.
b)stdout重定向应该支持一下的内部命令:
i.dir
ii.environ
iii.echo
iv.help
以上内部命令已在1中有具体解释,本处比在叙述。
使用输出重定向时,如果重定向字符为>,则创建输出文件,如果存在则覆盖之;如果重定向字符为〉〉,也会创建输出文件,如果存在则添加到文件尾。
5.shell必须支持后台程序执行。
如果在命令行后面添加&字符,在加载完程序后需要立刻返回命令行的提示符。
命令行提示符必须包含当前路径。
二、写一个关于使用如何使用shell的简单的用户手册,用户手册应该包括足够的细节以方便UNIX的初学者简单方便的使用这个shell程序。
例如:
解释i/o重定向,程序环境以及后台程序执行。
用户手册必须命名为readme,必须为一个可以并准文件编辑器可以打开的简单的文档。
例如这个描述类型和深度的例子,cah和tcsh的在线帮助(mancsh,mantcsh)。
这两个shell明显比我们所谓的shell具有更加强大功能。
所以用用户手册不一定要非常庞大,也不应包括编译指示——即文件列表和源代码,这个用户手册应该面向操作用户,所以台应该是一个操作用手册而不是一个程序员手册。
三、源代码必须有很详细得注释,并且要有很好的组织结构以方便非制作人员的阅读,维护或者修改。
结构和注释使程序跟更加易于阅读和理解,并且可以保证批改你的作业的人不用很费劲的去读你的源代码。
四、在提交的源代码文件中,包括:
a)原文件
b)makefile
c)readme
并且这些源代码应该能够编译完成完整的结果。
五、makefile必须产生二进制未见myshell。
例如一个makefile例子:
#JoeCitizen,s1234567-OperatingSystemsProject1
#CompLab1/01tutor:
FredBloggs
myshell:
myshell.cutility,cmyshell.h
gcc-Wallmyshell.cutility.c-omyshell
在执行命令符键入make就会产生myshell程序。
上述makefile从第4行必须以制表符开始。
六、根据上述第6点的实例中,提交的目录中应该包含以下文件:
i.makefile
ii.myshell.c
iii.utility.c
iv.myshell.h
v.readme
项目说明:
可以通过调用Linux下的/bin/sh来实现该项目shell,主要是实现几个nachos系统调用:
SysWrite,SysRead,SysExec,SysJoin,SysStrncmp然后就是在exception.cc中调用这些系统调用
在shell中它们的作用:
SysWrite:
显示提示符与shell的版本信息
SysRead:
读取n个字符到缓存buffer
SysExec与SysJoin:
主要是用来执行命令,如dir等。
如果该命令不存在则打印错误信息
SysStrncmp:
比较两个字符串的前n个字符,主要用来判断用户是否输入了exit命令以退出shell
Nachos中修改的地方:
1. syscall.h
添加了代码:
#defineSC_Strncmp43
intStrncmp(char*buffer,char*str,intsize);
2. Ksyscall
添加的代码:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#defineSHELL"/bin/sh"
intSysWrite(char*buffer,intsize,OpenFileIdid)
{
returnwrite(id,buffer,(size_t)size);
}
intSysRead(char*buffer,intsize,OpenFileIdid)
{
returnread(id,buffer,(size_t)size);
}
SpaceIdSysExec(char*exec_name)
{
pid_tchild;
child=vfork();
if(child==0)
{
execl(SHELL,SHELL,"-c",exec_name,NULL);
_exit(EXIT_FAILURE);
}
elseif(child<0)
returnEPERM;
return(SpaceId)child;
}
intSysJoin(SpaceIdid)
{
returnwaitpid((pid_t)id,(int*)0,0);
}
intSysStrncmp(char*buffer,char*str,intn)
{
returnstrncmp(buffer,str,(size_t)n);
}
3. exception.cc
caseSC_Write:
DEBUG(dbgSys,"WritefrombuffertoconsoleOutput"<
charwbuffer[60];//thebuffertostoreinformationfromuserprogram
intsize;
size=(int)kernel->machine->ReadRegister(5);
OpenFileIdprintOut;
printOut=(OpenFileId)kernel->machine->ReadRegister(6);
intaddressOne;
addressOne=(int)kernel->machine->ReadRegister(4);
inti;
i=0;
do{
kernel->machine->ReadMem(addressOne++,1,(int*)&wbuffer[i++]);
}while(i intn1; n1=SysWrite((char*)wbuffer,size,printOut); kernel->machine->WriteRegister(2,n1); /*Modifyreturnpoint*/ { /*setpreviousprogrammcounter(debuggingonly)*/ kernel->machine->WriteRegister(PrevPCReg,kernel->machine->ReadRegister(PCReg)); /*setprogrammcountertonextinstruction(allInstructionsare4bytewide)*/ kernel->machine->WriteRegister(PCReg,kernel->machine->ReadRegister(PCReg)+4); /*setnextprogrammcounterforbrachexecution*/ kernel->machine->WriteRegister(NextPCReg,kernel->machine->ReadRegister(PCReg)+4); }return; ASSERTNOTREACHED(); break; caseSC_Read: DEBUG(dbgSys,"readfrombuffer"< intrsize; rsize=(int)kernel->machine->ReadRegister(5); OpenFileIdenterIn; enterIn=(OpenFileId)kernel->machine->ReadRegister(6); charaddressTwo; addressTwo=(char)kernel->machine->ReadRegister(4); intlocal; local=(int)kernel->machine->ReadRegister(4);; intn2; n2=SysRead(&addressTwo,rsize,enterIn); kernel->machine->WriteMem(local,1,(int)addressTwo); kernel->machine->WriteRegister(2,n
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- NachOS 实验 报告