⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 00000004.htm

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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -