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

📄 00000002.htm

📁 一份很好的linux入门资料
💻 HTM
📖 第 1 页 / 共 2 页
字号:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;资料.&nbsp;complex&nbsp;data,可能为out-of-line&nbsp;memory或是port&nbsp;rights.&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(後述)&nbsp;<BR>&nbsp;<BR>port&nbsp;:=&nbsp;a&nbsp;protected&nbsp;queue&nbsp;of&nbsp;messages.&nbsp;简单的说就是message&nbsp;queue的id.&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;跟file&nbsp;descriptor差不多,为一个整数,代表一个message&nbsp;queue.&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message必须送到port(通信埠),而不是送给某个task或thread.&nbsp;<BR>port&nbsp;rights&nbsp;:=&nbsp;一个port的存取权限,&nbsp;send&nbsp;rights和receive&nbsp;rights.这种&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;存取权是以task为控制对象,而不是thread.&nbsp;send&nbsp;rights允许&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一个task(的所有threads)对某个port传送讯息.&nbsp;receive&nbsp;rights&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;类推.&nbsp;一个port可以把send&nbsp;rights给好几个tasks,但是只能有&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一个task有receive&nbsp;rights&nbsp;--&nbsp;拥有该port的task.&nbsp;有receive&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;right的task,就自动有send&nbsp;right)&nbsp;<BR>out-of-line&nbsp;memory&nbsp;:=&nbsp;传送大量的资料,&nbsp;message直接copy很没效率.&nbsp;透过&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;virtual&nbsp;memory系统改memory&nbsp;mapping,用copy-on-write的方式可&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;以改进.&nbsp;in-line&nbsp;memory传送是message从sender&nbsp;copy到kernel,&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;再由kernel&nbsp;copy-to&nbsp;receiver.&nbsp;out-of-line&nbsp;memory则是kernel&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;改一些virtual&nbsp;memory&nbsp;mapping,&nbsp;只有在sender/receiver&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;modify该资料时产生copy-on-write的page&nbsp;fault,&nbsp;只发生&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;了一次copy.&nbsp;<BR>&nbsp;<BR>complex&nbsp;data和simple&nbsp;data的不同是complex&nbsp;data需要kernel处理message的&nbsp;<BR>内容,再翻译给receiver.&nbsp;simple&nbsp;data直接transfer就可以了.&nbsp;<BR>&nbsp;<BR>每个task拥有task_self&nbsp;port的send-right.&nbsp;task_self&nbsp;port是kernel&nbsp;<BR>拥有的.&nbsp;task透过task_self&nbsp;port与kernel沟通.task另外有一个task_notify&nbsp;<BR>port的receive&nbsp;rights,用来接收(kernel)来的message.&nbsp;thread有thread_self&nbsp;<BR>port,用来送message给kernel,&nbsp;reply用来接收kernel传回来的reply&nbsp;<BR>(比如system&nbsp;call,&nbsp;rpc...).&nbsp;thread用的port,其&nbsp;port&nbsp;rights为task所有.&nbsp;<BR>另外还有exception&nbsp;port用来处理exception/signal/debug.前面讲过了.&nbsp;<BR>&nbsp;<BR>一个message内的资料结构有一栏为reply_port.&nbsp;如果sender需要reply就在&nbsp;<BR>此栏填入自己拥有的port.(所以自己就有receive&nbsp;right).&nbsp;message&nbsp;passing之中,&nbsp;<BR>kernel就会为receiver建立一个到reply_port的send&nbsp;right.&nbsp;<BR>&nbsp;<BR>Port&nbsp;Name&nbsp;Space&nbsp;<BR>&nbsp;<BR>port是一个整数,和file&nbsp;descriptor一样,&nbsp;每个task拥有独自的命名空间.&nbsp;<BR>ie.不同task的port&nbsp;id如果一样,&nbsp;say,编号100,并不是指到相同的port.&nbsp;<BR>&nbsp;<BR>Port&nbsp;translations&nbsp;<BR>&nbsp;<BR>由於port&nbsp;name&nbsp;space是task间互相独立的.&nbsp;kernel必须建立一个translation&nbsp;<BR>来记住谁是谁.&nbsp;(Unix是用global&nbsp;file&nbsp;descriptor&nbsp;table达成的).&nbsp;<BR>&nbsp;<BR>研读本章最令人感到不解的是port&nbsp;right.&nbsp;因为port的kernel&nbsp;data&nbsp;structure里面&nbsp;<BR>没有port&nbsp;right的纪录.&nbsp;那到底mach把port&nbsp;right资料藏到哪里去呢?搞了老半天,&nbsp;<BR>原来就是port&nbsp;translation.&nbsp;kernel的port&nbsp;translation就是port&nbsp;<BR>right.大胆一点说,&nbsp;<BR>就是mach&nbsp;kernel根本没有port&nbsp;right的观念.只要在port&nbsp;translation查的到的&nbsp;<BR>port,就可以送message就对了.&nbsp;<BR>&nbsp;<BR>port&nbsp;translations的每个entry,代表的都是一个connection.&nbsp;<BR>一个entry包含下列资料:&nbsp;&lt;task,&nbsp;local_name,&nbsp;kport,&nbsp;type&gt;,代表的意义是&nbsp;<BR>一个task的id是local_name的port,&nbsp;拥有对kport&nbsp;(一个指向kernel的port&nbsp;data&nbsp;<BR>structure的指标)的port&nbsp;right.&nbsp;port&nbsp;right是receive还是send呢?由type决定.&nbsp;<BR>local_name就是所谓的port&nbsp;right的名字.&nbsp;<BR>&nbsp;<BR>msg_send()用&nbsp;&lt;task,&nbsp;local_name,*,*&gt;找到kport,再由&nbsp;<BR>&lt;port.owner_task,*,port,*&gt;找到该port於task的local_name.&nbsp;<BR>&nbsp;<BR>task删掉一个port,&nbsp;kernel要找到kport,再除掉&lt;*,*,&nbsp;kport,&nbsp;*&gt;,并且&nbsp;<BR>通知相关的task.&nbsp;<BR>&nbsp;<BR>task结束要清掉&lt;task,*,*,*&gt;的所有kports.&nbsp;<BR>&nbsp;<BR>Kernel用两个hash&nbsp;table来快速存取translation,&nbsp;TP_table&nbsp;(key=&lt;task,port&gt;)&nbsp;<BR>TL_table(key=&lt;task,local_name&gt;)&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>Port&nbsp;Rights&nbsp;Transfer&nbsp;<BR>&nbsp;<BR>普通的port&nbsp;right&nbsp;transfer&nbsp;embed到message&nbsp;header里面,就是前面提&nbsp;<BR>的reply&nbsp;port.这样子的port&nbsp;right&nbsp;transfer是把自己的port的send&nbsp;&nbsp;<BR>right送给别人用的.比较复杂的就要用complex&nbsp;message.&nbsp;message里面,&nbsp;<BR>告诉kernel要把他人的(send&nbsp;right)送给第三者.&nbsp;(本章没有提到详情).&nbsp;<BR>这是mach&nbsp;name&nbsp;server的功能:除了之前提到的port之外,&nbsp;mach的每个&nbsp;<BR>task还有一个bootstrap&nbsp;port,透过此port,&nbsp;task可以送message到mach&nbsp;<BR>的name&nbsp;server.&nbsp;name&nbsp;server提供了存取其他server的机制.过程如下:&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;1.&nbsp;server向name&nbsp;server注册(透过bootstrap&nbsp;port)&nbsp;<BR>&nbsp;&nbsp;2.&nbsp;client向name&nbsp;server询问如何与server沟通.&nbsp;<BR>&nbsp;&nbsp;3.&nbsp;name&nbsp;server&nbsp;transfer一个到server的send&nbsp;right给client&nbsp;<BR>&nbsp;&nbsp;4.&nbsp;client得到一个可以和server沟通的port,利用此port和server联系.&nbsp;<BR>&nbsp;<BR>Mach的理想是把许多Unix&nbsp;kernel的机制变成user&nbsp;level&nbsp;server.&nbsp;name&nbsp;server&nbsp;<BR>是开启这个机制的钥匙.&nbsp;<BR>&nbsp;<BR>Port&nbsp;Interpolation&nbsp;<BR>&nbsp;<BR>Port&nbsp;interpolation可以让别人偷走某task的send/receive&nbsp;rights.&nbsp;<BR>Mach提供task_extract_send(),&nbsp;task_insert_send(),&nbsp;task_extract_receive(),&nbsp;<BR>task_insert_receive()来干这档事.&nbsp;debugger就是这样拦截ipc&nbsp;message的.&nbsp;<BR>&nbsp;<BR>netmsgserver&nbsp;<BR>&nbsp;<BR>另外一个和Port&nbsp;interpolation很像的机制,就是Mach的remote&nbsp;IPC.&nbsp;其实&nbsp;<BR>说穿了,&nbsp;Mach&nbsp;remote&nbsp;IPC的达成只是靠netmsgserver作proxy而已.&nbsp;<BR>Mach可以这样做的原因有二,&nbsp;第一个是send_msg()只要知道自己的&nbsp;<BR>local_port_name就行了,他不需要知道这个port怎样连,连到哪里去.这是&nbsp;<BR>port&nbsp;name&nbsp;server和netmsgserver的工作,&nbsp;task尽管往name&nbsp;server告诉他的&nbsp;<BR>port送就可以了.第二点是senders是匿名的.&nbsp;receiver无法从message得知&nbsp;<BR>sender是谁.所以netmsgserver可以提供完全透明的服务.&nbsp;<BR>&nbsp;<BR>Mach&nbsp;3.0对IPC的问题做了一些改进,自己看吧.&nbsp;这是Mach&nbsp;2.5&nbsp;IPC&nbsp;<BR>会遇到的问题.&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>Chapter&nbsp;7&nbsp;Synchronization&nbsp;and&nbsp;Multiprocessors&nbsp;<BR>&nbsp;<BR>提到Kernel&nbsp;synchronization的演算法和资料结构.特别是multiprocessor&nbsp;<BR>下的问题.&nbsp;multiprocessor最大的问题在virtual&nbsp;memory的cache/tlb&nbsp;<BR>synchronize&nbsp;的问题.本章没有提到,&nbsp;延至virtual&nbsp;memory再讨论.&nbsp;<BR>&nbsp;<BR>Chapter&nbsp;7讨论的内容颇为琐碎,&nbsp;不适合摘要.&nbsp;<BR>&nbsp;<BR><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER></BODY></HTML>

⌨️ 快捷键说明

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