Linux 版 (精华区)
发信人: netiscpu (夜☆星光点点☆), 信区: Linux
标 题: NACHOS论坛(4)
发信站: 紫 丁 香 (Sun Nov 8 17:27:47 1998), 转信
寄信人: ship.bbs@bbs.xmu.edu.cn
标 题: NACHOS论坛(4)(转寄)
发信站: 华南理工大学 BBS木棉站
日 期: Sun Mar 9 15:00:35 1997
作 家: 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
--
m;32m※ 转寄:.华南网木棉站 bbs.gznet.edu.cn.[FROM: mtlab.hit.edu.cn]
--
Enjoy Linux!
-----It's FREE!-----
※ 来源:.紫 丁 香 bbs.hit.edu.cn.[FROM: mtlab.hit.edu.cn]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:210.125毫秒