NachOS实验报告(4个全) 联系客服

发布时间 : 星期五 文章NachOS实验报告(4个全)更新完毕开始阅读6bdecb2ccfc789eb172dc8e0

~/nachos-3.4$ make

当需要单独编译线程管理部分时,先进入threads 目录,然后采用如下命令: ~/nachos-3.4/threads$ make depend ~/nachos-3.4/threads$ make nachos

实际上,各部分目录下都有一个Makefile 文件,内容大体相同,区别在于一些条件编译的

参数。比如在单独编译线程管理部分时,文件管理部分就被屏蔽了,这样读者读者就可以专

心于线程管理部分的调试。

四、应用程序的编译

由于Linux 指令集和R2/3000 指令集不同,用户编写的应用程序用Linux 系统中标准gcc 编

译后,不能直接在Nachos 虚拟机环境下运行。所以需要采用交叉编译技术。所谓交叉编译

技术是在一个操作系统下将源码编译成另一个操作系统的目标码,这里就是在Linux 下通过

gcc 交叉编译版本将用户程序的源码编译成R2/3000 指令集的目标码。

在Linux 中,没有缺省的交叉编译工具。读者可以到上海交通大学计算机系FTP 服务器上

下载,URL 为:

ftp://donkey.cs.sjtu.edu.cn/linux/cross-compiler.tgz

该文件的解开需要有超级用户的权利,将解开至/usr/local/目录下: /# gzip -dc cross-compiler.tgz | tar xf -

在编译用户程序时,用交叉编译器将源码编译成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=/myshell,其中

/myshell是可以执行的shell完整路径(及shell的可执行路径,而不是他在目录下的硬连接路线)。

2. 其他的命令行输入被解释为程序的调用,shell创建并执行折个程序,

并作为自己的子进程。程序的执行的环境变量包含在以下条目中: parent=/shell,其中/myshell已经在1.i)中描述过了。

3. Shell必须能够从文件中提取命令输入 例如shell使用以下命令行被调用:

programname arg1 arg2 outputfile

这个批处理文件应该包括一组命令集,当到达文件结尾时shell退出。很明显,如果shell被调用是没有使用参数,他会在屏幕上显示提示符请求用户输入。

4. Shell必须支持i/o重定向,stdin和stdout,或者其中之一 a) 例如命令行:

programname arg1 arg2 outputfile

使用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的在线帮助(man csh,man tcsh)。这两个shell明显比我们所谓的shell具有更加强大功能。所以用用户手册不一定要非常庞大,也不应包括编译指示——即文件列表和源代码,这个用户手册应该面向操作用户,所以台应该是一个操作用手册而不是一个程序员手册。

三、 源代码必须有很详细得注释,并且要有很好的组织结构以方便非制作人员

的阅读,维护或者修改。结构和注释使程序跟更加易于阅读和理解,并且可以保证批改你的作业的人不用很费劲的去读你的源代码。

四、 在提交的源代码文件中,包括: a) 原文件 b) makefile c) readme

并且这些源代码应该能够编译完成完整的结果。

五、 makefile必须产生二进制未见myshell。

例如一个makefile例子:

#Joe Citizen,s1234567-Operating Systems Project 1 #CompLab1/01 tutor: Fred Bloggs

myshell:myshell.c utility,c myshell.h gcc-Wall myshell.c utility.c-o myshell

在执行命令符键入make就会产生myshell程序。上述makefile从第4行必须以制表符开始。

六、 根据上述第6点的实例中,提交的目录中应该包含以下文件:

i. makefile ii. myshell.c

iii. iv. v. utility.c myshell.h 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

添加了代码:#define 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 \

int SysWrite(char*buffer ,int size,OpenFileId id) {