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水木清华站∶精华区