Nachos是建立在一个软件模拟的虚拟机上的。该虚拟机包括计算机的基本部分:如CPU、主存、寄存器、中断系统,还包括一些外部设备,如终端设备、网络以及磁盘系统。

用软件来模拟硬件另一个优点是充分利用了宿主机操作系统的软件资源,避免了编写复杂的硬件控制程序。更重要的是提高了程序的可移植性,只要在不同硬件上实现 Nachos 虚拟机就完成了 Nachos 的大部分移植工作。将 Nachos 移植到Linux 上的工作就受益于这种设计。

一、Nachos的目录结构

在nachos-3.4的目录下含有:

copyright

文件

Nachos的版权信息

readme

文件

Nachos的readme信息

nachos.ps

文件

Nachos的介绍文档(Postscript格式)

c++example

目录

有关C++介绍和实例

doc

目录

Nachos各个部分介绍和原有的作业要求

code

目录

Nachos各个部分的源代码

最主要的部分是Nachos的源代码部分。它的目录结构是:

Makefile

Makefile.common

Makefile.dep

文件

文件

文件

Nachos的Makefile文件。当Nachos需要移植到其它系统时,可以修改Makefile.dep中的HOST参数

machine

目录

Nachos虚拟机模拟部分源代码

threads

目录

Nachos线程管理部分源代码

filesys

目录

Nachos文件系统管理部分源代码

userprog

目录

Nachos用户程序部分源代码

network

目录

Nachos网络管理部分源代码

vm

目录

Nachos虚拟内存管理部分源代码

test

目录

一些测试用应用程序

bin

目录

包含有用户程序目标码变换的程序

二、Nachos源文件

Nachos是用C++语言中的类来表示各个对象的。

其中Machine类用来模拟计算机主机。它提供的功能有:读写寄存器。读写主存、运行一条用户程序的汇编指令、运行用户程序、单步调试用户程序、显示主存和寄存器状态、将虚拟内存地址转换为物理内存地址、陷入 Nachos 内核等等。

Machine类实现方法是在宿主机上分配两块内存分别作为虚拟机的寄存器和物理内存。运行用户程序时,先将用户程序从 Nachos 文件系统中读出,写入模拟的物理内存中,然后调用指令模拟模块对每一条用户指令解释执行。将用户程序的读写内存要求,转变为对物理内存地址的读写。Machine类提供了单步调试用户程序的功能,执行一条指令后会自动停下来,让用户查看系统状态,不过这里的单步调试是汇编指令级的,需要读者对R2/3000指令比较熟悉。如果用户程序想使用操作系统提供的功能或者发出异常信号时,Machine调用系统异常陷入功能,进入Nachos的核心部分。

Interrupt类用来模拟硬件中断系统。在这个中断系统中,中断状态有开,关两种,中断类型有时钟中断、磁盘中断、控制台写中断、控制台读中断、网络发送中断以及网络接收中断。机器状态有用户态,核心态和空闲态。中断系统提供的功能有开/关中断,读/写机器状态,将一个即将发生中断放入中断队列,以及使机器时钟前进一步。

在Interrupt类中有一个记录即将发生中断的队列,称为中断等待队列。中断等待队列中每个等待处理的中断包含中断类型、中断处理程序的地址及参数、中断应当发生的时间等信息。一般是由硬件设备模拟程序把将要发生的中断放入中断队列。中断系统提供了一个模拟机器时钟,机器时钟在下列情况下前进

1 用户程序打开中断

2 执行一条用户指令

3 处理机没有进程正在运行

机器时钟前进时,中断处理的过程如下图所示:

Nachos中断处理时机

所以,在Nachos中只有在时钟前进时,才会检查是否有中断会发生,而Nachos模拟时钟前进的时机不是任意的,这样即使打开了中断,中断也不能在任意时刻发生。只有在模拟时钟前进的时候才能处理等待着的中断。通过以后的叙述我们可以看到,在执行非用户代码的大部分时间里,系统不会被中断。这意味着不正确的同步代码可能在这个硬件模拟环境下工作正常,而实际上在真正的硬件上是无法正确运行的。

在有些中断处理程序的最后可能要进行正文切换,可以通过调用 Interrupt 类的一个成员函数来要求时钟前进的时候进行正文切换。中断系统还提供关机的功能,当系统中没有正在运行的进程同时系统中没有除了时钟中断以外的其它中断时,Nachos结束运行。

在这个中断系统基础上,Nachos模拟了各种硬件设备,这些设备都是异步设备,依靠中断来与主机通信。

Timer类模拟定时器。定时器每隔X个时钟周期就向CPU发一个时钟中断。它是时间片管理必不可少的硬件基础。它的实现方法是将一个即将发生的时钟中断放入中断队列,到了时钟中断应发生的时候,中断系统将处理这个中断,在中断处理的过程中又将下一个即将发生的时钟中断放入中断队列,这样每隔X个时钟周期,就有一个时钟中断发生。

由于Nachos是一个软件模拟的系统,有很多的随机事件需要通过一定的控制来实现。所以系统中在计算下一个时钟中断应发生的时间时,还加入了一些随机值,使得中断发生的时间间隔不确定,这样就与现实的定时器更相似。

Console类模拟的是控制台设备。当用户程序向控制台写一个字符时,写程序立即返回,过了给定的时钟周期后I/O操作完成,控制台向CPU发一个控制台写中断。但是控制台是否有用户输入可供读取是随机的,所以控制台每隔给定的时钟周期向CPU发一个控制台读中断,周期性地发中断的方法与定时器的类似,即先计算下一个控制台读中断将发生的时间,然后将读中断放入中断队列,等待读中断的发生。读中断发生后,如果有用户输入的话,控制台读中断处理过程将控制台输入的字符放入字符缓冲区。当用户从控制台读字符时,把字符缓冲区的内容传给用户。控制台的读/写分别用两个文件来模拟。

Disk类模拟了物理磁盘,它一次只能接受一个读写请求,当读写操作完成后向CPU发一个磁盘中断。该物理磁盘只有一个面,分为几个磁道,每道又分为几个扇区。每道的扇区数,每个扇区的存储容量都是固定的。磁盘的使用者可以读写指定的扇区,读写单位是一个扇区。模拟磁盘用宿主机文件系统中一个文件来实现,当用户发出读写请求时,Nachos的处理过程如下:

  1. 从模拟文件中读出数据或向模拟文件写入数据。
  2. 计算磁盘操作需要的时间。磁盘操作时间 = 移动磁头寻道的时间 + 旋转到读写扇区的时间 + 数据传送的时间。
  3. 将一个磁盘读/写中断放入中断队列,因为中断是在操作完成后发生的。所以,中断发生时间 = 当前时间 + 磁盘操作时间。

每个Nachos运行时是宿主机上的一个进程,如果在宿主机上运行多个Nachos进程,这些Nachos进程可以组成一个网络,而每个Nachos进程就是一个网络节点。Network类模拟了一个网络节点。这个网络节点可以把报文发送到网络的其他节点上。报文的长度固定,Nachos模拟了在现实网络中时常发生的报文丢失的情况;但是报文中的内容不会在网络传送中被修改破坏。每个网络节点都有全网络唯一的“地址”,报文传送的起始节点、目的节点都是由这个“地址”表示。

报文在网络中的传递是用通过Socket(套接口)来实现的。每个节点还有一个可靠性系数,用来模拟报文从这个节点发出后丢失的概率。Network的实现与控制台类似,每隔一定的时钟周期,就产生一个网络接收中断,网络接收中断处理过程是:

  1. 将下一个网络接收中断放入中断队列以实现中断的周期性发生。
  2. 如果报文缓冲区中已有报文,则返回。
  3. 读取套接口,如果没有报文,则返回。
  4. 读取报文,把它放入报文缓冲区。
  5. 调用本节点自定义的接收处理函数。

在现有实现中,报文缓冲区只能存放一个报文,有可能因为报文缓冲区满而造成报文丢失(上面第2行),可以多设几个报文缓冲区来减少丢失的可能性。

Network类提供了让网络用户读取已经收到的报文的成员函数,当报文缓冲区为空时,它返回空,否则从报文缓冲区读出报文,并将报文缓冲区清空,返回刚读出的报文。

报文发送的过程是:

  1. 将网络发送中断放入中断队列。
  2. 产生一个随机数。
  3. 如果这个随机数大于网络的可靠性系数,则不发送报文(用来模拟报文丢失),否则通过套接口将报文发送出去。

从以上的叙述中可以看出,中断系统成为整个Nachos虚拟机的基础,其它的模拟硬件设备都是建立在中断系统之上的。在此之上,加上Machine类模拟的指令解释器,可以实现Nachos的线程管理、文件系统管理、虚拟内存、用户程序和网络管理等所有操作系统功能。

Nachos系统的整体结构。

转载于:https://www.cnblogs.com/lefan/archive/2013/01/16/2863520.html

NachOS简述和源文件相关推荐

  1. C++ 中头文件(.h)和源文件(.cc)的写法简述

    C++ 中头文件(.h)和源文件(.cc)的写法简述 用C++编写比较大型的项目时,文件的分割管理确实确实是非常必要的 .下面就非常简洁明了地谈谈头文件(.h)和源文件(.cc)应该怎么写. 头文件( ...

  2. C++ 笔记(25)— 理解 C++ 中的头文件和源文件的作用

    1. C++ 编译模式 通常,在一个 C++ 程序中,只包含两类文件: .cpp 文件,被称作 C++ 源文件,里面放的都是 C++ 的源代码 .h 文件,被称作 C++ 头文件,里面放的也是 C++ ...

  3. c 中头文件和源文件的区别是什么

    区别:头文件是".h"文件,提供接口:源文件是".cpp"文件,提供实现.编译器规定源文件必须包含函数入口,即main函数:而头文件不得包含函数入口,头文件不可 ...

  4. C++头文件和源文件,编译过程

    源文件如何根据#include来关联头文件  1.系统自带的头文件用尖括号括起来,这样编译器会在系统文件目录下查找. #include <xxx.h> 2.用户自定义的文件用双引号括起来, ...

  5. C++中头文件(.h)和源文件(.cpp)都应该写些什么

    原文出处:https://www.cnblogs.com/fenghuan/p/4794514.html 头文件(.h): 写类的声明(包括类里面的成员和方法的声明).函数原型.#define常数等, ...

  6. 【C++】在 Visual Studio 调试器中指定符号 (.pdb) 和源文件(转载自RSS翻译)

     在 Visual Studio 调试器中指定符号 (.pdb) 和源文件 查找并指定符号文件和源文件:指定符号加载行为.使用符号和源服务器:自动或按需加载符号.  内容 查找符号 (.pdb) ...

  7. C++头文件和源文件的编译过程

    源文件如何根据#include来关联头文件 1.系统自带的头文件用尖括号括起来,这样编译器会在系统文件目录下查找. #include <xxx.h> 2.用户自定义的文件用双引号括起来,编 ...

  8. C++里面头文件和源文件都要怎么编写以及运行

    ** 作为一个资深菜鸟,最近在看那本c++primer时对前面的书店程序难免有点兴趣,便打开vs2017想用宇宙第一IDE装下b,结果是一大堆问题,搞得我不知所措. 首先打开vs,创建新项目时,就之前 ...

  9. C++类模板怎么写在单独的头文件和源文件中

    今天打算研究研究之前我们领导写的一段关于类模板的代码,后来发现有点坑需要记录一下.以往关于C++模板基本上都是写一个demo,然后运行通过,没有软件工程的样子,所以今天我按以往的惯例写了一个类模板,打 ...

最新文章

  1. 3D IoU-Net:三维目标检测预测IoU
  2. FL2440的U-boot-2009.08移植(三)支持Nor FLASH
  3. php aes 128位加密,php实现AES 128位加密的相关操作技巧分享
  4. Android布局大全
  5. Sybase数据库应用系统调优的五大领域
  6. [Bhatia.Matrix Analysis.Solutions to Exercises and Problems]ExI.1.1
  7. opencv访问图片的每一像素
  8. SkyDrive和Google Drive比较
  9. aop日志 android,ASM实现Android APK的AOP日志统计
  10. python函数分为哪几种_python函数有哪几种
  11. 如何判断Hadoop集群是否搭建成功
  12. pandas中的绘图函数(什么是kde)
  13. 阿里巴巴erp【商业化操作系统】什么是erpadmin
  14. 处理echarts地图省份坐标重叠的方法
  15. DT内核圆柱模板行业站点主动tags三项主动推送插件
  16. nginx 基本使用
  17. python练习一(对txt文本的操作:切割,切片,格式化输出)
  18. 超强:Unix道德经(英文版)
  19. matlab求马尔可夫转移矩阵,求马尔科夫模型的转移矩阵_马尔科夫转移矩阵
  20. python爬虫入门_3种方法爬取古诗文网站

热门文章

  1. Java——类的继承
  2. 数据库-临时表和复制表
  3. android 有序广播例子,有序广播的实例解析--android案例《拦截有序广播》
  4. python getcwd 与dirname_Python中获取路径os.getcwd()和os.path.dirname(os.path.realpath(__file__))的区别和对比...
  5. 快过年了,用JS让你的网页放烟花吧
  6. python 做界面时如何使图片保持透明背景_Python matplotlib生成图片背景透明的示例代码...
  7. mongodb连接池 php,node.js,mongodb_nodejs使用mongodb连接池,node.js,mongodb - phpStudy
  8. 设备 esp32_「ESP 教程」ESP32 如何运行 TensorFlow 模型
  9. phalcon index.php,Phalcon环境搭建与项目开发
  10. 关于大量数据的随机打乱重保存.(少了详细解释,之后会更新)