BBS水木清华站∶精华区

发信人: raner (lilo), 信区: Linux 
标  题: NACHOS论坛(4) 
发信站: BBS 水木调试站 (Thu Jun  4 16:48:44 1998) 
 
作  家: solmon (所罗门王) on board 'Unix' 
题  目: NACHOS论坛(4) 
来  源:  鼓浪听涛站 
日  期: Thu Mar  6 23:05:32 1997 
出  处: mysu@JingXian.xmu.edu.cn 
 
           第四章    网络及虚拟内存 
 
 
    Nachos的网络的实现分为两层:Network和PostOffice.首先,请您不要误解Network 
的含义,它并不是一个网络操作系统,而是Nachos操作系统在接收或发送网络信息时的 
管理模块.换句话说,Nachos的Network只管本地机对网络信息的处理,它并不关心网络 
是如何实现信息传递的.Network的结构是,每个主机上有一个邮局(PostOffice)来负责 
处理用户的Network请求.每个邮局中有几个信箱(MailBox),它存放着从网络上接收到 
的信息. 
 
    如果一个Nachos进程要通过网络将信息从本地发往另一个Nachos工作站,它首先要 
象现实生活中那样先填写收信人,发信人的地址.地址由两部分组成:1.节点地址;2.信 
箱号.然后将信的内容放在地址信息之后,送到邮局去发送(即调用PostOffice的Send成 
员函数).当一个进程要接收一个信息,它就到邮局去取某个信箱中的信息(即调用 
PostOffice的Receive成员函数),如果信箱中有信件,邮局会把信件给它,同时把发信人 
的节点地址和信箱号也告诉它.与现实生活不同的是:如果信箱里没有信,取信进程并不 
返回,而是睡眠等待,直到有信件来到时才唤醒它.Nachos还模拟了信件的丢失,但是由 
于现代网络通讯中使用了检验纠错码,可以检查信件内容是否被改动过了.如果信件内 
容不对,则认为信件丢失,所以Nachos只对信件丢失进行模拟,而没有模拟信件内容出 
错.Nachos假定只要收到信件,就认为它的内容是正确的.Nachos的现有实现中,发信进 
程并不知道信是否成功地发到了指定信箱. 
 
    现在让我们看看网络实现的细节.Network模拟了一个物理网络节点.它的具体实现 
在机器模拟部分已作了介绍,这里就不再重复了.PostOffice是与网络用户打交道的界 
面.PostOffice中有一组信箱类的对象(MailBox),信箱类提供了将信件放入信箱和从信 
箱中取出信件的功能.不过这些功能只供PostOffice类使用,网络用户不能直接调用.每 
个信箱中有一个信件队列,当进程要从一个信箱中取出信件时,如果信件队列非空,则从 
队列头部取出一封信交给取信进程,否则取信进程将睡眠等待信的到来.当一封信放入 
信箱时,它被加入此信箱的信件队列.如果有进程在等待这个信箱的信,就唤醒这个进程. 
    PostOffice的生成函数的参数有: 
        1.本PostOffice所在网络的地址; 
        2.网络的可靠性参数; 
        3.PostOffice中MailBox的个数. 
    PostOffice的生成函数的执行过程如下: 
        1.生成两个信号量:报文发送和报文收到信号量.它们的初值都为零. 
        2.再生成报文发送锁,几个MailBox对象,一个Network对象. 
        3.利用Nachos的进程管理系统生成一个“Postal Worker"进程. 
    "Postal Worker"进程做一个无穷循环工作,每次循环的过程如下: 
        1.对报文收到信号量作P操作,作用是等待报文的来到.当从网络中收到了一个 
                报文时,中断处理程序将对报文收到信号量作V操作,以唤醒本进程. 
        2.它重新占用CPU后,从网络上读出这则报文.调用报文中指定的信箱的Put函 
                数,将这则报文放入信箱. 
    PostOffice发送信件的过程是: 
        1.关闭报文发送锁.以保证只有一个报文在发送. 
        2.把报文放到网络上发送. 
        3.对报文发送信号量作P操作,等待报文发送完毕.报文发送完毕后,中断系统 
                将发送中断,在中断处理程序中将对报文发送信号量作V操作.就可以 
                唤醒本进程. 
        4.打开报文发送锁,让下一个报文可以发送. 
    网络用户进程调用PostOffice去取信箱中的信件时,PostOffice调用相应的MailBox 
的Get 成员函数取出信箱中的信件.如果信箱中没有信件,在Get函数中,取信进程将睡 
眠等待. 
 
    Nachos的虚拟内存管理比较简单,主要是页式管理.用户程序中的虚拟地址向物理 
内存地址变换的过程受页表或快表控制.页表和快表的数据项的结构是一样的,都由一 
个虚页号,一个实页和一些其它的标志组成.页表和快表的不同点在于大小不同,快表比 
页表小得多,里面放的是最常用的页表项,可以看作是页表的高速缓冲区.当快表不存在 
时就用页表进行地址转换,否则使用快表.虚实地址转换是由 
int translate(int virtAddr,int * physAddr, int size, bool writing)完成的. 
其中: 
        virAddr --要转换的虚地址; 
        physAddr--用来存放转换成功后的实地址; 
        size--内存读写的长度; 
        writing--是否是写内存操作. 
    如果转换成功,则返回无错的标志,否则返回出错类型. 
    当用户程序读写内存时,Nachos先调用translate函数进行虚实地址转换,如果 
translate返回值是无错,则用实地址读写内存,否则发出一个异常信号,信号类型就是 
translate的返回值.让我们来看看地址转换具体过程: 
 
                      ↓ 
               ━━━━━━━━ 
                 虚地址是否             N 
                  字对齐了          ━━━━━━┓ 
               ━━━━━━━━                 ┃ 
                      ┃                        ┃ 
                      ┃Y                       ↓ 
                      ↓             ┏━━━━━━━━┓ 
              ┏━━━━━━━━┓   ┃  返回地址错误  ┃ 
              ┃ 计算出虚地址   ┃   ┗━━━━━━━━┛ 
              ┃ 对应的虚页号vpn┃ 
              ┃ 和页内偏移量   ┃ 
              ┗━━━┳━━━━┛ 
                      ┃ 
                      ↓ 
               ━━━━━━━━━       Y 
                   快表存在          ━━━━┓ 
               ━━━━━━━━━            ┃ 
                      ┃                     ┃ 
                      ┃ N                   ┃ 
                      ↓                     ↓ 
                ━━━━━━━         ━━━━━━━━ 
          Y       虚页号vpn         N   有一个快表项的 
       ┏━━    大于页表个数     ┏━  虚页号等于vpn 
       ┃       ━━━━━━━    ┃   ━━━━━━━━ 
       ↓             ┃          ┃             ┃ 
┏━━━━━━━━┓  ┃ N        ↓             ┃ 
┃  返回地址错误  ┃  ┃     ┏━━━━━━━━┓┃ Y 
┗━━━━━━━━┛  ┃     ┃ 返回页失效错误 ┃┃ 
                      ┃     ┗━━━━━━━━┛┃ 
                      ↓ 
          N      ━━━━━━                    ↓ 
       ┏━━     此页已装入          ┏━━━━━━━━┓ 
       ┃            内存             ┃ entry=此虚页   ┃ 
       ↓        ━━━━━━         ┃ 对应的快表项   ┃ 
┏━━━━━━━━┓  ┃              ┃    入口        ┃ 
┃ 返回页失效错误 ┃  ┃              ┗━━━━┳━━━┛ 
┗━━━━━━━━┛  ┃ Y                      ┃ 
                      ↓                        ┃ 
              ┏━━━━━━━━┓              ┃ 
              ┃ entry=此虚页   ┃              ┃ 
              ┃ 对应的页表项   ┃              ┃ 
              ┃    入口        ┃              ┃ 
              ┗━━━┳━━━━┛              ┃ 
                      ┃                        ┃ 
                      ┃                        ┃ 
                      ┗━━━━━┳━━━━━━┛ 
                                  ┃ 
                                  ↓ 
                          ━━━━━━━━━━ 
                 Y         writing参数为TRUE 
             ┏━━━      而entry指向的页为 
             ┃                 只读页 
             ┃           ━━━━━━━━━━ 
             ┃                   ┃ 
             ↓                   ┃ 
     ┏━━━━━━━━┓         ┃   N 
     ┃  返回只读错误  ┃         ┃ 
     ┗━━━━━━━━┛         ↓ 
                    ┏━━━━━━━━━━━━━━━┓ 
                    ┃  PageFrame = entry 项中的    ┃ 
                    ┃         物理页号             ┃ 
                    ┗━━━━━━┳━━━━━━━━┛ 
                                  ┃ 
                                  ↓ 
               Y     ━━━━━━━━━━━━━━ 
             ┏━━    PageFrame >= 物理页总数 
             ┃      ━━━━━━━━━━━━━━ 
             ┃                   ┃ 
             ↓                   ┃ 
      ┏━━━━━━━━┓        ┃ N 
      ┃  返回总线错误  ┃        ┃ 
      ┗━━━━━━━━┛        ↓ 
                        ┏━━━━━━━━━━━┓ 
                        ┃  置entry的使用标志   ┃ 
                        ┗━━━━┳━━━━━━┛ 
                                  ┃ 
                                  ↓ 
                            ━━━━━━━       N 
                              是写请求       ━━━━┓ 
                            ━━━━━━━           ┃ 
                                  ┃                 ┃ 
                                  ┃ Y               ┃ 
                                  ↓                 ┃ 
                        ┏━━━━━━━━━━━┓   ┃ 
                        ┃  置entry的写标志     ┃   ┃ 
                        ┗━━━━┳━━━━━━┛   ┃ 
                                  ┃                 ┃ 
                                  ┃ ←━━━━━━━┛ 
                                  ↓ 
                        ┏━━━━━━━━━━━┓ 
                        ┃ 计算实地址,并放入    ┃ 
                        ┃     physAddr中       ┃ 
                        ┗━━━━┳━━━━━━┛ 
                                  ┃ 
                                  ↓ 
                          ┏━━━━━━━━┓ 
                          ┃  返回无错误    ┃ 
                          ┗━━━━━━━━┛ 
 
 
-- 
m※ 来源:.鼓浪听涛站 bbs.xmu.edu.cn.[FROM: mysu@JingXian.xmu.ed] m 
 
-- 
※ 来源:·BBS 水木调试站 Leeward.lib.tsinghua.edu.cn·[FROM: 166.111.68.98] 

BBS水木清华站∶精华区