~/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
c) dir
e) echo
表符可能被缩减为一个空格)。
f) help——显示用户手册,并且使用more命令过滤。 g) pause——停止shell操作直到按下回车键。 h) quit——推出shell。
i) shell的环境变量应该包含shell=
2. 其他的命令行输入被解释为程序的调用,shell创建并执行折个程序,
并作为自己的子进程。程序的执行的环境变量包含在以下条目中: parent=
3. Shell必须能够从文件中提取命令输入 例如shell使用以下命令行被调用:
programname arg1 arg2
这个批处理文件应该包括一组命令集,当到达文件结尾时shell退出。很明显,如果shell被调用是没有使用参数,他会在屏幕上显示提示符请求用户输入。
4. Shell必须支持i/o重定向,stdin和stdout,或者其中之一 a) 例如命令行:
programname arg1 arg2
使用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
#define SHELL \
int SysWrite(char*buffer ,int size,OpenFileId id) {
相关推荐: