下载此文档

进程消息系统中消息发送的全过程.ppt


文档分类:论文 | 页数:约11页 举报非法文档有奖
1/11
下载提示
  • 1.该资料是网友上传的,本站提供全文预览,预览什么样,下载就什么样。
  • 2.下载该文档所得收入归上传者、原创者。
  • 3.下载的文档,不会出现我们的网址水印。
1/11 下载此文档
文档列表 文档介绍
进程消息系统中消息发送的全过程 1 MINIX3 的C库中( src/lib/i386/rts/ 文件中)提供了函数: Send(dest,&message) 用来对消息进行发送,这些库函数仅供驱动程序、服务器进程及用户系统调用库函数使用,而不供用户随意使用,用户进程只能在系统调用库函数中向 PM 、 FS 、 RS 服务器发送消息并等待应答,相应消息的类型也已经由 PM 、 FS 、 RS 预先定义好。 2 第一步: send(dst,&message) 将函数调用的参数 dst, &message 以及消息通信的功能号 SEND=1 保存在寄存器 eax 、 ebx 、 ecx 中, 并通过 int SYSVEC ( int 33 )进入核心态。 3 ?__send: ? push ebp ? mov ebp, esp ? push ebx ? mov eax, SRC_DST(ebp) ! eax 目标地址? mov ebx, MESSAGE(ebp) ! ebx 放消息指针? mov ecx, SEND ! SEND 标识? int SYSVEC ! trap 调度 中的_s_call ? pop ebx ? pop ebp ? ret 4 ?第二步:执行 33 号中断处理程序 s_call ( 06649 行)。在转到 06649 行执行前,先将栈从用户态切换到核心态下,现行栈位于用户进程的 proc 的现场保存区中,栈中已压入原来用户栈的栈顶指针 ss,esp ,还有断点的 eflags 和 cs,eip ,此时 ss选择的是核心数据段,但 ds 选择的还是用户数据段。下面的程序主要是保存断点其余的现场信息到 proc 中,包括 esi,edi,ds,es,fs,gs ;但 eax,ecx,edx,ebx 等信息不用保存;然后将 ds 也指到核心数据段;再启用真正的核心栈;并先将函数参数压栈,再去调用 sys_call(function, src_dest, m_ptr) 。 5 ?第三步:执行 07480 行 sys_call(function, src_dest, m_ptr) 。可以看出,对发送来讲,在发送前要做一系列的检查: ?首先要检查当前进程是否有向其他进程发送消息的特权(如用户进程就没该特权,用户进程只有发送并等应答,或者是 ECHO 功能),另外还规定不能单向地发消息给任务。?看对方 p_nr 是否合法; ?看消息地址正确与否(是否完全在自己的数据空间中) ?看当前进程是否能向目的进程发送消息(如用户进程,只能想服务器进程发送消息并等应答) ?最后调用 mini_send() 真正完成发送过程。 6 ?第四步:执行 07591 行 mini_send(caller_ptr, dst, m_ptr, flags) 。它首先检查此次发送是否会引起死锁,然后看接收者是否正在等待发送进程的消息, 如果是则直接将消息从发送进程的数据空间复制到接收进程的数据空间(采用特权级别为 1的类似于核心 ES 的段描述符进行数据的复制),否则将发送进程加到接收进程的 p_caller_q 队列中,并将发送进程置成阻塞状态(但目前仍然是发送进程正在执行)。 mini_send() 过程中没出错则返回 OK (即使阻塞了,发送还是成功的),否则则返回错误码(如检测到可能发生死锁时返回 ELOCKED 。?最后返回到 sys_call ()中的 07565 行。 7 ?第五步:从 mini_send(caller_ptr, dst, m_ptr, flags) 返回到 07565 行继续执行 sys_call() ,并将 mini_send() 的返回值作为 sys_call() 的返回值(发送过程没出错时返回 OK ,否则返回错误码)返回到 06674 行 33 号中断处理程序内。 C函数的返回值是被保存在 eax 寄存器中的。 8 ?第六步:继续从 06674 行起执行 33 号中断处理程序内的指令,它首先将 sys_call() 的返回值保存到进程现场保存区保存 eax 值的地方( 06674 行),然后执行 restart 进行中断返回。 9 ?第七步:执行 restart 进行 CPU 的分派, CPU 可能分派给原来正在执行的进程,也可能分派给新的进程(比如:发送进程因为发送而阻塞,则在“第四步”执行 mini_send() 时会将它从就绪队列中移除, 此时 dequeue() 会选择新进程, next_ptr

进程消息系统中消息发送的全过程 来自淘豆网www.taodocs.com转载请标明出处.

相关文档 更多>>
非法内容举报中心
文档信息
  • 页数11
  • 收藏数0 收藏
  • 顶次数0
  • 上传人ranfand
  • 文件大小0 KB
  • 时间2016-06-07
最近更新