对 Nachos-3.4-ualr 这个教学操作系统的功能的一些扩展,下含七个实验博主与舍友合作完成,舍友主要负责文件系统部分。
对于实验有疑惑的同学可以看根目录下的实验指北
Nachos 是美国加州大学伯克莱分校在操作系统课程中已多次使用的操作系统课程设计平台,在美国很多大学中得到了应用,它具有一下几个突出的特点:
-
采用通用虚拟机:
Nachos 是建立在一个软件模拟的虚拟机之上的,模拟了
MIPS R2/3000
的指令集、主存、中断系统、网络以及磁盘系统等操作系统所必须的硬件系统。许多现代操作系统大多是 先在用软件模拟的硬件上建立并调试,最后才在真正的硬件上运行。用软件模拟硬件的可靠性比真实硬件高得多,不会因为硬件故障而导致系统出错,便于调试。虚拟机可以 在运行时报告详尽的出错信息,更重要的是采用虚拟机使Nachos的移植变得非常容易, 在不同机器上移植 Nachos,只需对虚拟机部分作移植即可。采用
R2/3000
指令集的原因是该指令集为RISC
指令集,其指令数目比较少。Nachos 虚拟机模拟了其中的 63 条指令。由于R2/3000
指令集是一个比较常用的指令集,许多 现有的编译器如 gc++能够直接将 C 或 C++源程序编译成该指令集的目标代码,于是就不必编写编译器,读者就可以直接用 C/C++语言编写应用程序,使得在 Nachos 上开发 大型的应用程序也成为可能。 -
面向对象性:
Nachos 的主体是用 C++的一个子集来实现的。它能够清楚地描述操作系统各个部分的接口。Nachos 没有用到面向对象语言的所有特征,如继承性、多态性等,代码就更容易阅读和理解。
安装Nachos在Linux操作系统之上后生成一个nachos-3.4-ualr-lw
的文件夹,该目录中主要包含一下几个部分:
文件夹名 | 子文件夹名 | 作用 |
---|---|---|
c++ example | 介绍C++的实例 | |
code | ---- | |
bin | 包含有用户程序目标码变换的程序 | |
filesys | Nachos文件系统管理部分源代码 | |
machine | Nachos 虚拟机模拟部分源代码 | |
threads | Nachos 线程管理部分源代码 | |
userprog | Nachos 用户程序部分源代码 | |
network | Nachos 网络管理部分源代码 | |
lab2-7 | 具体实验的文件夹,里面包含有Makefile和一些基础文件 | |
Makefile.common | code/目录中的 Makefile.common 首先括入 Makefile.dep,然后用 vpath 定义各类 文件搜索路径。 | |
Makefile.dep | Makefile.dep 文件用于定义由 g++使用的系统依赖关系的宏。它 被括入在 code/Makefile.common 文件中。 | |
doc | Nachos各个部分的介绍 |
实验内容:
- 准备Linux宿主操作系统环境;
- Nachos实验代码框架(源码目录)的基本分析;
- Makefile的基本分析;
- 硬件机制模拟部分的实现原理分析,包括中断、时钟、CPU指令执行。
注意:实验1没有代码的编写、演示验收及提交,因此分数完全来自于以上4部分实验内容在实验报告中的撰写质量情况。
实验内容:
- 熟悉Nachos原有的线程调度策略;
- 设计并实现具有静态优先级的非抢占式线程调度策略。提示:List类中已有的SortedInsert方法可加以利用。
实验内容: 使用操作系统信号量机制,编写程序解决生产者/消费者同步问题。包括:
- 理解Nachos的信号量是如何实现的;
- 生产者/消费者问题是如何用信号量实现的;
- 在Nachos中是如何创建并发线程的;
- 在Nachos下是如何测试和debug的。
实验内容:扩展Nachos的基本文件系统。Nachos的文件系统是一个简单并且能力有限的系统,限制之一就是文件的大小是不可扩展的。通过扩展,使得文件的大小是可变的。在扩展写入文件内容时,一边写入,一边动态调整文件的长度及所占用的数据扇区。 提示:对一般的OS,一个100字节的文件,open后lseek到偏移50处,write 10字节,close后,文件长度还是100字节,不会截短到60字节。这在实现Nachos的-hap命令行选项时需要注意。
实验内容:Nachos系统原有的文件系统只支持单级索引,最大能存取NumDirect * SectorSize = 30 * 128 = 3840字节大小的文件。本实验将在理解原文件系统的组织结构基础上扩展原有的文件系统,设计并实现具有二级索引的文件系统。
二级索引文件头i-node设计:
如上图所示,构建具有二级索引的i-node,原先的前NumDirect-1项还是直接索引,最后一项(数组下标为NumDirect-1)指向一个二级索引块,这个块存放新的索引条目,共NumDirect+2项(数组下标0~NumDirect+1)。扩大后的文件最大长度为(29 + 32)* 128 = 7808字节。
二级索引块是动态产生的,当文件大小不需要它时,一级索引块的最后一项设置为-1,此时不存在二级索引块。当文件大小增长到一级索引无法支持时,再分配一个新的块存二级索引,并将其扇区号存入一级索引块的最后一项,形成上图所示的结构。
实验内容:
-
扩展现有的class AddrSpace的实现,使得Nachos可以实现多道用户程序。
-
按照实验指导书中的方法,完成class AddrSpace中的Print函数。
-
实现Nachos 系统调用:Exec()。
实验内容: 在未实现虚拟内存管理之前,Nachos在运行一个用户进程的时候,需要将程序运行所需所有内存空间一次性分配。虚拟内存实现将突破物理内存限制。本实验核心任务为根据理论学习中涉及的对换(Swapping)技术,设计并实现用户空间的虚拟内存管理。 页置换算法可以采用FIFO、二次机会、增强型二次机会、LRU等算法之一,或自己认为合适的其他算法。