BBS水木清华站∶精华区
发信人: raner (lilo), 信区: Linux
标 题: NACHOS论坛(1)
发信站: BBS 水木调试站 (Thu Jun 4 16:43:12 1998)
作 家: solmon (所罗门王) on board 'Unix'
题 目: NACHOS论坛(1)
来 源: 鼓浪听涛站
日 期: Thu Mar 6 23:02:20 1997
出 处: [email protected]
第一章 机器模拟
Nachos是建立在一个软件模拟的虚拟机上的.这个虚拟机包括计算机的基本部分,
如CPU,主存,中断系统,还有一些外部设备,如键盘,显示器,网络,以及磁盘系统.现代
许多操作系统都是先在用软件模拟的硬件上建立并调试,最后才在真正的硬件上运行.
这样做便于调试程序.因为软件模拟的硬件可靠性比真实的硬件高的多,不会因为硬件
故障而导致系统出错.模拟的硬件还可以监视程序对硬件的操作,严格限制程序对硬件
的操作,并在程序误操作时报告详尽的出错信息.这些都是真实硬件难以做到的.
Nachos用软件来模拟硬件还可以充分利用现有的软件资源,避免了编写复杂的硬件
控制程序.更重要的是可以提高程序的可移植性,只要在不同硬件上实现这个虚拟机器
就完成了大部分移植工作.我们移植Nachos的工作就受益于这种设计.
下面就介绍Nachos的机器模拟的细节.
Machine类用来模拟计算机主机.它提供的功能有:读写寄存器,读写主存,运行一条
用户程序的汇编指令,运行用户程序,单步调试用户程序,显示主存和寄存器状态,将虚拟
内存地址转换为物理内存地址,陷入Nachos内核等等.
Machine类实现方法是分配两块内存分别作为虚拟机的寄存器和物理内存.运行用户
程序时,先将用户程序从Nachos文件系统中读出,然后调用指令模拟模块对每一条用户指
令解释执行.对用户程序的读写内存要求,将调用虚拟内存模块提供的功能把它转变为对
物理内存地址的读写.当用户要求调试程序时,执行一条指令后会自动停下来,让用户查
看系统状态.如果用户程序想使用操作系统提供的功能或者发出异常信号时,Machine调
用系统陷入功能,进入Nachos的核心部分.
从Machine类的功能可以看出,它是用户和操作系统的界面,用户的各种操作都通过
它去调用相应的Nachos模块,也可以说Machine类是Nachos的总控部分.
Interrupt类用来模拟硬件中断系统.在这个中断系统中,中断状态有开,关两种,中
断类型有时钟中断,磁盘中断,控制台写中断,控制台读中断,网络发送中断,网络接收中
断.机器状态有用户态,核心态和空闲态.中断系统提供的功能有开/关中断,读/写机器状
态,将一个即将发生中断放入中断队列,以及使机器时钟前进一步.
在Interrupt类中有一个记录即将发生中断的队列,这个队列的元素中包括的信息有:
中断类型, 中断处理程序的地址及参数,中断应当发生的时间.一般是由硬件设备模拟程
序把将要发生的中断放入中断队列.中断系统提供了一个模拟的机器时钟,机器时钟在下
列情况前进一步:
1.用户程序打开中断
2.执行一条用户指令
3.没有进程占用处理机
机器时钟前进时,处理的过程如下图:
┃
↓
┏━━━━━━━━━━━┓
┃ 关闭中断 �
┗━━━━━━━━━━━┛
┃
┏━━━━━━━━━━━→↓
┃ ━━━━━━━━━
┃ 中断队列中有 ━━━━━━━┓
┃ 应当发生的中断 ┃
┃ ━━━━━━━━━ ┃
┃ ┃ ┃
┃ ┃Y ┃
┃ ↓ ┃
┃ ┏━━━━━━━━━━━━━━━┓ ┃
┃ ┃取出队列中一个应当发生的中断, ┃ ┃
┃ ┃调用这个中断的处理程序去处理 ┃ ┃
┃ ┃ 中断 ┃ ┃
┃ ┗━━━━━━━━━━━━━━━┛ ┃
┃ ┃ ┃
┃ ┃ ┃
┗━━━━━━━━━━━━┛ ┃
┃
┏━━━━━━━━━━━━━┛
┃
↓
┏━━━━━━━━━━━┓
┃ 打开中断 ┃
┗━━━━━━━━━━━┛
┃
┃
↓
━━━━━━━━━━━━ N
中断的处理程序 ━━━┓
要求进行正文切换 ┃
━━━━━━━━━━━━ ┃
┃ ┃
┃Y ┃
↓ ┃
┏━━━━━━━━━━━┓ ┃
┃ 进行正文切换 ┃ ┃
┗━━━━━━━━━━━┛ ┃
┃ ┃
┃ ┃
┃ ←━━━━━━━━━━┛
↓
由此可见,在Nachos中,即使打开了中断,中断也不能在任意时刻发生.只有在模拟时
钟前进的时候才能处理等待着的中断,也就是说,在执行非用户代码的大部分时间里,系
统不会被中断.这意味着不正确的同步代码可能在这个硬件模拟环境下工作正常,而在真
正的硬件上无法运行.
中断处理程序可以调用Interrupt类的一个成员函数来要求时钟前进的时候进行正
文切换.中断系统还提供关机的功能,关机后Nachos就结束了.
在这个中断系统基础上,Nachos模拟了各种硬件设备,这些设备都是异步设备,依靠
中断来与主机通信.
Timer类模拟的是定时器.定时器每隔X个时钟周期就向CPU发一个时钟中断.它是时
间片管理必不可少的硬件基础.它的实现方法是将一个即将发生的时钟中断放入中断队
列,到了时钟中断应发生的时候,中断系统将处理这个中断,在中断处理的过程中又将一
个即将发生的时钟中断放入中断队列,这样每隔X个时钟周期,就有一个时钟中断发生.在
计算下一个时钟中断应发生的时间时,Nachos还加入了一些随机值,使得中断发生的时间
间隔不确定,这样就与现实的定时器更相似了.
Nachos还模拟了控制台设备.当用户向控制台写一个字符时,写程序立即返回,过了
给定的时钟周期后I/O操作完成,控制台向CPU发一个写中断.此外,控制台每隔给定的时
钟周期向CPU发一个读中断,周期性地发中断的方法与定时器的类似,即先计算下一个中
断将发生的时间,然后将中断放入中断队列,等待中断的发生.中断发生后,读中断处理过
程将控制台输入的字符放入字符缓冲区.当用户从控制台读字符时,把字符缓冲区的内容
传给用户.控制台的读/写分别用两个文件来模拟.
Nachos模拟了物理磁盘,它一次只能接受一个读写请求,当读写操作完成后向CPU发
一个磁盘中断.这个磁盘只有一个面,分为几个磁道,每道又分为几个扇区.每道的扇区
数,每个扇区的存储容量都是固定的.磁盘的使用者可以读写指定的扇区,读写单位是一
个扇区.模拟磁盘用一个文件来实现,当用户发出读写请求时,Nachos的处理过程如下:
1.从模拟文件中读出数据或向模拟文件写入数据.
2.计算磁盘操作需要的时间.磁盘操作时间 = 移动磁头寻道的时间 +
旋转到读写扇区的时间 + 数据传送的时间.
3.将一个磁盘读写中断放入中断队列,因为中断是在操作完成后发生的,所
以.中断发生时间 = 当前时间 + 磁盘操作时间
Network类模拟了一个网络节点.这个网络节点可以把报文发送到网络的其他节点
上.报文的长度固定,还可以模拟在现实网络中时常发生的报文丢失.不过一旦报文收到
了,里面的内容是正确的,不会在网络传送中被修改破坏.每个网络节点都有一个全网络
唯一的标志号,报文传送的起始节点,目的节点都是由这个标志号表示.每个网络节点在
接收到报文后除了做所有节点一样的操作外,还可以做一些本节点特有的操作.定义这
些特有的操作的函数及其参数是在这个节点生成时用参数传入的.在节点发送报文完成
时,也可以做一些自定义的操作.这样就可以在这个网络硬件层次上再构造一层更抽象,
功能更完善的虚拟网络了.例如虚拟网络可以通过请求重发机制来实现一个不会丢失报
文的虚拟网络.
报文在网络中的传递是用UNIX中的套接口(Socket)实现的.每个节点还有一个可靠
性系数,用来模拟报文从这个节点发出后丢失的概率.Network的实现与控制台类似,每
隔一定的时钟周期,就产生一个读取网络的中断,中断处理过程是:
1.将下一个中断放入中断队列以实现中断的周期性发生.
2.如果报文缓冲区中已有报文,则返回.
3.读取套接口,如果没有报文,则返回.
4.读取报文,把它放入报文缓冲区.
5.调用本节点自定义的接收处理函数.
在现有实现中,报文缓冲区只能存放一个报文,有可能因为报文缓冲区满而造成报文
丢失,可以多设几个报文缓冲区来减少丢失的可能性.
Network提供了让网络用户读取已经收到的报文的成员函数,当报文缓冲区为空时,
它返回空,否则从报文缓冲区读出报文,并将报文缓冲区清空,返回刚读出的报文.
报文发送的过程是:
1.将网络发送中断放入中断队列.
2.产生一个随机数.
3.如果这个随机数大于网络的可靠性系数,则不发送报文(用来模拟报文丢
失),否则通过套接口将报文发送出去.
--
m※ 来源:.鼓浪听涛站 bbs.xmu.edu.cn.[FROM: [email protected]]
--
※ 修改:·raner 於 Jun 4 16:45:21 修改本文·[FROM: 166.111.68.98]
※ 来源:·BBS 水木调试站 Leeward.lib.tsinghua.edu.cn·[FROM: 166.111.68.98]
BBS水木清华站∶精华区