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

Minix的系统调用相关推荐

  1. Minix进程间通信分析

    进程间通信(IPC: Inter-Process Communication), 可以直接理解为进程间互相发送消息,进程间互相发送消息的方式有很多,比如消息传递,管道,共享内存等都可以,本文主要分析消 ...

  2. 一个操作系统的实现(8)进程间通信

    主要内容 实现进程间的通信 一 Linux的系统调用与Minix的系统调用不同,以点见面可以了解一些宏内核与微内核的区别. Linux的fork函数通过调用中断0x80,通过IDT转化为_system ...

  3. 【操作系统】Oranges学习笔记(五) 第六章 进程

    文章目录 6.1 迟到的进程 6.2 进程概述 6.2.1 进程介绍 6.2.2 未雨绸缪--形成进程的必要考虑 6.2.3 参考的代码 6.3 最简单的进程 6.3.1 简单进程的关键技术预测 1. ...

  4. Linux操作系统基础理论(3)-----浅析Linux 与Minix 下进程实现的异同

    Linux操作系统基础理论(3)-----浅析Linux 与Minix 下进程实现的异同 目录 摘要:... 1 1.     引言... 1 1.1  Minix简介... 1 1.2  Linux ...

  5. 鸿蒙基于开源minix系统,鸿蒙系统的微内核是

    最近华为高调发布了鸿蒙操作系统(HarmonyOS),基于微内核的全场景分布式系统,可以按需扩展,低延时,实现更广泛的系统安全.按照发布会的PPT来看,鸿蒙OS有三层架构,第一层是微内核,第二层是基础 ...

  6. 简要聊聊UNIX,MINIX,LINUX,BSD的区别与特质

    聊聊linux,minux,bsd,unix的历史与区别 Linux.MINIX.BSD和UNIX都是类UNIX操作系统,它们都是基于UNIX操作系统的,但也有很多不同点. UNIX操作系统最早由贝尔 ...

  7. 操作系统进程相关-以Linux0.11和MINIX为代表

    二.linux操作系统 2.1.操作系统的启动 (1) 开机时,系统复位,CS:IP被复位为0xFFFF0,于是跳转到0xFFFF0处执行命令.此处为jmp指令.跳转到段地址0xF000:0xE05B ...

  8. Minix内存管理(1)

    Minix内存管理 1概述 Minix 在设计时被分成了四层,如下图所示,第1层和第2层是进程管理和I/O任务,合称为Minix的核心(kernel), 内存管理(Memory Manager,下文简 ...

  9. Minix源码解读:Minix总体框架

    1.1    minix初始化过程     系统启动,选择映像,进入pre_init() (kernel/arch/i386/pre_init.c) 在MINIX3内核被成功加载到内存后,控制权会转移 ...

最新文章

  1. python exec函数_Python3 exec 函数
  2. 【算法设计与分析】最长公共子序列问题 动态规划算法 超详细
  3. 房天下数据爬取及简单数据分析
  4. python中回车怎么表示_如何在python中使用读取行仅拆分回车符?
  5. Django之Apache2部署
  6. android之canvas绘制矩形
  7. 网站优化如何创作优质的内容?
  8. Laravel 开发笔记
  9. (十)统计表速查(标准正态分布、t分布、卡方分布)
  10. 软件测试动态分析,静态分析工具和动态测试工具
  11. php添加页脚,WordPress网站页脚footer.php修改图文教程
  12. 【计算情与思】大学生学习和发展的思考和建议
  13. 逻辑运算符,if、swtch语句(java基础知识三)
  14. oracle大数据量查询超时排查
  15. 开放式式商业模式_开放式和封闭式耳机之间有什么区别,我应该得到什么?
  16. 用python进行进制转换(二十六进制)
  17. ImportError: No module named datetime全局python解决time显示问题
  18. 192本软件著作用词分析(二)
  19. 蓝牙5.1的ble那些事儿
  20. 滑稽树下你和我(树+贡献)

热门文章

  1. app error login.php,如何解决uniapp登录错误提示问题
  2. const关键字在c语言的作用,C语言const关键字作用
  3. java 父类_java 调用父类的父类
  4. python 正则表达式 分组_正则表达式之分组的用法
  5. 2016设置方框的尺寸_手把手教你用Word打印标准尺寸的身份证“复印件”
  6. python6翻了_Python老司机也会翻车!10个最容易犯的Python开发错误
  7. Android星座查询实验报告,数字基带传输实验实验报告
  8. MyReport.TD套打引擎介绍
  9. Rocket - decode - 最小项与最大项
  10. SpringBoot 2.0 系列005 --启动实战之SpringApplication应用