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
Minix的系统调用相关推荐
- Minix进程间通信分析
进程间通信(IPC: Inter-Process Communication), 可以直接理解为进程间互相发送消息,进程间互相发送消息的方式有很多,比如消息传递,管道,共享内存等都可以,本文主要分析消 ...
- 一个操作系统的实现(8)进程间通信
主要内容 实现进程间的通信 一 Linux的系统调用与Minix的系统调用不同,以点见面可以了解一些宏内核与微内核的区别. Linux的fork函数通过调用中断0x80,通过IDT转化为_system ...
- 【操作系统】Oranges学习笔记(五) 第六章 进程
文章目录 6.1 迟到的进程 6.2 进程概述 6.2.1 进程介绍 6.2.2 未雨绸缪--形成进程的必要考虑 6.2.3 参考的代码 6.3 最简单的进程 6.3.1 简单进程的关键技术预测 1. ...
- Linux操作系统基础理论(3)-----浅析Linux 与Minix 下进程实现的异同
Linux操作系统基础理论(3)-----浅析Linux 与Minix 下进程实现的异同 目录 摘要:... 1 1. 引言... 1 1.1 Minix简介... 1 1.2 Linux ...
- 鸿蒙基于开源minix系统,鸿蒙系统的微内核是
最近华为高调发布了鸿蒙操作系统(HarmonyOS),基于微内核的全场景分布式系统,可以按需扩展,低延时,实现更广泛的系统安全.按照发布会的PPT来看,鸿蒙OS有三层架构,第一层是微内核,第二层是基础 ...
- 简要聊聊UNIX,MINIX,LINUX,BSD的区别与特质
聊聊linux,minux,bsd,unix的历史与区别 Linux.MINIX.BSD和UNIX都是类UNIX操作系统,它们都是基于UNIX操作系统的,但也有很多不同点. UNIX操作系统最早由贝尔 ...
- 操作系统进程相关-以Linux0.11和MINIX为代表
二.linux操作系统 2.1.操作系统的启动 (1) 开机时,系统复位,CS:IP被复位为0xFFFF0,于是跳转到0xFFFF0处执行命令.此处为jmp指令.跳转到段地址0xF000:0xE05B ...
- Minix内存管理(1)
Minix内存管理 1概述 Minix 在设计时被分成了四层,如下图所示,第1层和第2层是进程管理和I/O任务,合称为Minix的核心(kernel), 内存管理(Memory Manager,下文简 ...
- Minix源码解读:Minix总体框架
1.1 minix初始化过程 系统启动,选择映像,进入pre_init() (kernel/arch/i386/pre_init.c) 在MINIX3内核被成功加载到内存后,控制权会转移 ...
最新文章
- python exec函数_Python3 exec 函数
- 【算法设计与分析】最长公共子序列问题 动态规划算法 超详细
- 房天下数据爬取及简单数据分析
- python中回车怎么表示_如何在python中使用读取行仅拆分回车符?
- Django之Apache2部署
- android之canvas绘制矩形
- 网站优化如何创作优质的内容?
- Laravel 开发笔记
- (十)统计表速查(标准正态分布、t分布、卡方分布)
- 软件测试动态分析,静态分析工具和动态测试工具
- php添加页脚,WordPress网站页脚footer.php修改图文教程
- 【计算情与思】大学生学习和发展的思考和建议
- 逻辑运算符,if、swtch语句(java基础知识三)
- oracle大数据量查询超时排查
- 开放式式商业模式_开放式和封闭式耳机之间有什么区别,我应该得到什么?
- 用python进行进制转换(二十六进制)
- ImportError: No module named datetime全局python解决time显示问题
- 192本软件著作用词分析(二)
- 蓝牙5.1的ble那些事儿
- 滑稽树下你和我(树+贡献)
热门文章
- app error login.php,如何解决uniapp登录错误提示问题
- const关键字在c语言的作用,C语言const关键字作用
- java 父类_java 调用父类的父类
- python 正则表达式 分组_正则表达式之分组的用法
- 2016设置方框的尺寸_手把手教你用Word打印标准尺寸的身份证“复印件”
- python6翻了_Python老司机也会翻车!10个最容易犯的Python开发错误
- Android星座查询实验报告,数字基带传输实验实验报告
- MyReport.TD套打引擎介绍
- Rocket - decode - 最小项与最大项
- SpringBoot 2.0 系列005 --启动实战之SpringApplication应用