Minix的系统调用

Linux的fork系统调用很容易理解,但Minix的就不这么简单了,它刚开始甚至可能让你感到迷惑。我们来打开Minix代码文件src/kernel/proc.c,在函数sys_call()的开头,你可以看到这样的代码:

PUBLIC int sys_call(function, src_dest, m_ptr)

int function;                   /* SEND, RECEIVE, or BOTH */

int src_dest;                   /* source to receive from or dest to send to */

message *m_ptr;                 /* pointer to message */

{

  /* The only system calls that exist in MINIX are sending and receiving

   * messages.  These are done by trapping to the kernel with an INT instruction.

.......
.......
.......
* The trap is caught and sys_call() is called to send or receive a message
   * (or both). The caller is always given by proc_ptr.
   */
  ……
}

 

开头这段注释非常重要,一个“only”道破天机(或者将你搞晕):在Minix中,不再像Linux那样有许许多多的系统调用 (sys_call_table[]中列出的有几十个),而是仅有发送和接收消息的系统调用。通过sys_call的参数function的注释我们可以 知道,系统调用的种类总共有三个,那就是SEND、RECEIVE,以及BOTH。

可是系统调用虽少,实现的功能却不能少,那么Minix是怎样通过仅仅三个系统调用就实现与以Linux为代表的宏内核OS一样多的功能呢?我们仍以fork()为例,来看一下Minix是怎么做的。

相对于Linux,Minix的机制显得有点复杂,我们还是直接来看图。

 

跟Linux不同,这里多出来一个内存管理器(MM),fork()所要做的工作是由它来负责的(如果是另外的系统调用,那么具体工作可能就不是由 MM来负责,比如系统调用read()就是由FS来负责的,跟MM类似,FS是单独运行的另一个进程),那么MM是如何得到用户进程的通知的呢?正是消息 机制在进程之间起到了重要作用,它类似于邮政系统,在信封(或包裹单)上写明目的地,消息就送达了。

图中使用了三种箭头,实线表示消息的发送过程,点线表示消息的获取过程,虚线表示发送和接收消息都会经历的过程。

进程对fork()的调用将最终转化成调用src/kernel/proc.c中的sys_call(),消息(即图中的m)的地址这时已经作为参 数被传递进来,sys_call()可以据此得知m的内容,并在适当的时候将内容传递给MM。MM的工作其实说起来很简单,它不断地获取并处理消息,所以 它能够得到用户进程发送的m,并将其存放在mm_in中。当MM通过获得的mm_in得知了消息的内容是要进行fork操作,它就进一步调用其 do_fork()完成整个过程。

消息的一送一收之间,fork()的大致过程我们就已经基本了解了。其实我们也完全可以猜测出其他系统调用的情况。不外乎是通过调用_syscall()转化成发送消息,将来会有相应的进程取出消息进行处理。

说到这里,有一个情况需要说明,就是我们拿Linux中的fork()和Minix中的fork()来比较是有些不公平的。因为你也一定已经看到, 实现方式真正与Linux的fork()相同的是Minix的_sendrec()和_receive(),它们都是通过中断进入内核,在内核中完成任 务。而Minix中的fork()是通过两个进程分别调用_sendrec()和_receive()这两个系统调用来实现的,从这个意义上来 说,Minix中的fork()其实不算系统调用(这也是函数sys_call()的开头注释中说Minix的系统调用只有三个的原因),它只是在完成一 个紧密依赖系统调用的工作罢了。不过从用户的角度,这种差别是看不到的,而且只要调用fork()时能实现需要的功能,这种差别就无关紧要。因此用户完全 可以称fork()为一个系统调用。

实现方法的差别源于设计思路的不同。在Minix中,真正的系统调用只有三个,这意味着内核不必事无巨细地处理用户进程要求的所有工作,只需要做好 其“邮局”的职能,将消息按照需求来回传送就够了。在Linux中内核所做的工作,在Minix中被交给专门的进程来完成。你可能一下子就明白了,原来微 内核的“微”字是让内核功能最简化的意思。

 

感谢该仁兄的分享:http://book.51cto.com/art/200906/126852.htm

 

 

 

转载于:https://www.cnblogs.com/Ricezhang/articles/MINIX.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值