又一波微内核讨论,同时也见到网上太多的言论,甚至把RT-Thread物联网操做系统归类到微内核行列。因此从新把这篇科普文章发下,并作部分澄清。
html
本篇文章是RT-Thread新加入伙伴,俊小哥 对微内核学习后的科普文章,本文是第一篇;还有第二篇《Fuchsia微内核的性能指标状况》,已有初稿,后续在整理完毕后再分享给你们,会详细给出相同硬件平台下Fuchsia和Linux的应用性能对比指标。git
关于微内核的定义,这里有一份简单的描述:内核运行在内核态,只包含基本的多任务调度功能;其余系统服务都运行在用户态,包括文件系统,网络协议栈,甚至内存管理,驱动都是一个个独立的用户态进程,并相互作内存隔离。应用须要使用系统服务时,都经过IPC发送消息来使用其余用户态服务。而宏内核,用户应用是经过系统调用直接来使用系统服务。因此微内核,消息传递是基本形态。基于这样的理解,RT-Thread目前是宏内核,更严谨些应该是Unikernel(内核与应用都运行在内核态)。github
对于十分碎片化物联网场景,对其中大部分的海量物联网节点来讲,并不适合使用微内核,由于其中Flash、RAM资源很是紧张(例如Cortex-M架构或其余MCU,广泛在数百kB Flash空间,几十kB RAM空间),甚至是按照字节方式节省着使用,已经负担不起内核与应用分离的方式来使用。而微内核中常说起的安全隔离优势,在MCU上也没有硬件来支撑(没有MMU,或者MPU能保护的区段数也很是受限)。这也是RT-Thread对这类资源受限设备,始终都维持这样构架的缘由。web
——熊大浏览器
下面让咱们重温俊小哥的微内核科普文章:安全
什么是微内核
微内核设计的基本思想是简化内核功能,在内核以外的用户态尽量多地实现系统服务,同时加入相互之间的安全保护。内核只提供最基础的服务,好比进程调度,进程通讯(IPC)等。其中进程通讯是做为链接应用与用户态系统服务的桥梁。微信
下图是宏内核与微内核的对比示意图网络
上图左侧表示宏内核的架构,宏内核系统相关的服务基本都是放于内核态内核中,例如文件系统,设备驱动,虚拟内存管理,网络协议栈等;而微内核,则把更多的系统服务(例如文件系统,POSIX服务,网络协议栈,甚至外设驱动)放到用户态应用,造成一个个服务,等待其余应用的请求。架构
然后来,为了在宏内核与微内核之间扬长避短,也发展出了中间的混合内核的形态,部分服务也会放置于内核中。上图右侧表示便是混合内核的架构。app
其实微内核与混合内核,混合内核与宏内核之间并没有十分明确的界限,通常状况下把最多只具有IPC(进程通讯),进程调度,内存管理功能的内核称为微内核、把包含全部系统服务的内核称为宏内核、有少部分系统服务在用户态或者比微内核多一些系统服务的内核称为混合内核。
微内核的发展历史
微内核这个概念从提出开始就在不断地发展、完善进步之中,到目前为止能够分为三代。
第一代微内核:从无到有
第一代微内核的主要表明是Mach,该系统由卡内基-梅隆大学的Avie Tevanian和Richard Rashid主导开发。在Mach刚刚开始设计时,UNIX的发展正如日中天,因此Mach在设计时的一大目标就是兼容UNIX,可是与UNIX不一样的是Mach尝试使用微内核架构去设计。Mach以IPC是做为全部系统服务与内核交换数据的基础机制,充分运用IPC,虚拟内存,多进程等特性将冗余的系统服务移出内核做为进程运行。
1986年,通过两年的开发,初版的Mach发布后的第二年,Mach就发布了第2版,不过因为时间仓促,加之没有足够的人手与资金,因此此时Mach内核并不提供彻底的系统服务。为了支撑系统上层运行,这一版的内核包含了大量4.3版本的BSD系统(UNIX的一个分支)代码提供系统服务,而且BSD系统服务运行在内核状态,这致使Mach内核的代码体积甚至大于常规UNIX内核。初版和第二版的Mach主要作了以下工做:1. 验证了微内核的可行性;2. 在多处理器计算机上进行移植验证了微内核在多处理器计算机上的运行;3. 最后为了提升IPC的效率,Mach使用共享内存机制来完成IPC。而Mach的共享内存机制是在虚拟内存技术的支持下实现的,只有须要对内存进行写入时才进行复制。这么一处理比每次都复制一遍内存节省了内存使用同时又加快了IPC机制的处理时间,这个改进称为写时复制,而且在现在的通用操做系统如Linux中经常用到。
通过测试,Mach 2.5的效率最多比UNIX少25%,考虑到Mach带来的可靠性,可拓展性,安全性,这个损失尚能够接受。固然此时Mach内核还不算彻底的微内核。而考虑到微内核能够更高效地利用多处理器计算机的处理器核心资源,人们期待着等Mach把系统服务都搬到内核以外后能够把运行效率损失降下来。同时Mach在微内核方面小小的尝试迅速吸引了大批公司与组织的注意,开放软件基金会(Open Software Foundation, OSF)宣布下一代系统OSF/1将基于Mach的内核, NeXTSTEP也将使用Mach2.5, 甚至IBM也打算利用Mach构建Workplace OS。苹果公司这个时候也出手了,苹果公司也今后基于Mach2.5打造其操做系统内核XNU,XNU的构成以下图所示,Mach做为内核的内环,外环右侧是苹果的驱动框架(I/O Kit),外环左侧是BSD的系统服务代码提供UNIX兼容的服务层,这三者共同协做向上层提供完整的系统服务。XNU普遍地使用在苹果公司的OSX,IOS等系统中。
第二代微内核:解决性能问题
第二代微内核的主要表明是L3和L4,以及QNX系统使用的Neutrino内核。前面第一代的微内核Mach因为效率问题虽然失败了,可是微内核的理念并无被放弃,德国的计算机科学家Jochen Liedtke认为Mach的IPC效率低下的缘由就是由于IPC部分不够精简,因而他开发了L3和L4微内核,对IPC部分进行了很完全的精简:1. 内核的IPC机制只是单纯地传递信息,诸如安全权限检查这类的代码都省略掉,省略掉的功能所有由用户进程本身处理。如此一来IPC功能部分的代码执行时间大大缩短;2. IPC不使用内存传递消息,而使用寄存器传递消息,同时限制IPC每次传递的信息长度,这样省去了对内存的访问时间。L4微内核的IPC速度通过测试要比Mach快20倍,这个使人惊讶的优化效果吸引了众多的目光,使微内核的研究从新火热起来。后面L4内核又发展出了不少相关系统,好比Pistachio,L4/MIPS,与Fiasco等等,这些内核组成了L4的你们族。
第二代微内核的表明除了有L4内核,也还有其余微内核好比Exokernel,Rambler,不过商业上最成功的则是目前黑莓公司旗下的QNX系统所使用的Neutrino内核(QNX,1980年时最先以QUICK UNIX诞生;2004年QNX被Harman国际收购;2010年被黑莓收购Harman国际下的QNX资产),QNX主要为高可靠领域提供解决方案,好比交通,能源,医疗,航天航空等。
第三代微内核:主要重视安全问题等
在前面两代的基础上,第三代微内核蓬勃发展,许许多多微内核都被开发出来,主要表明有:seL4, Fiasco.OC, NOVA等。原本第一代微内核的设计隔离了使内核安全性下降的系统服务,让系统服务漏洞不会影响内核,进而提升了内核安全性,能够说是关上了破坏系统的门, 可是第二代系统却又给攻击者开了个窗户;因为第二代微内核在内核中省去了关于安全性检查等步骤,把全部关于安全检查功能的实现都交给系统服务本身去实现,这致使系统服务的通讯接口直接暴露给用户态,任何进程均可能无限制地请求系统服务,系统服务不得不花费额外的代价来区分请求是否合法,容易形成拒绝服务攻击。好比正常的文件服务应该是从虚拟文件系统服务->文件系统服务->磁盘驱动服务这个流程来完成的,可是若是攻击者若是绕过虚拟文件系统服务,直接无限制地请求攻击者自己没有权限访问的文件系统服务,使文件系统服务长期处于满载状态,让其余进程没法经过正常的虚拟文件系统获得文件系统服务。为了加强安全性,且不过度影响性能,人们开始研发第三代微内核。
seL4是在第二代内核L4的基础上发展而来的。seL4不只仅继承了L4内核家族的高性能特性,还具有基于端点(enndpoint)的IPC机制。这种IPC机制最大的特色是使用了能力空间的概念,进程在使用IPC请求系统服务时必须具有相对应的能力,进程持有不可伪造的令牌来表示拥有请求某种服务的能力。令牌能够被复制,能够被转移,还能够经过IPC进行传输。令牌实际上是一个指向存在于内核空间内核对象的指针,因此普通进程并不能修改自身以及其余进程的权限分配,可是内核能够对令牌指定的权限进行控制,从而保证了用户态不能绕过能力空间这个机制对系统服务形成滥用。
seL4仍是第一个彻底经过形式化验证的内核,通俗说形式化验证就是在数学软件的帮助下使用数学语言自动化地推导检查系统的每个运行状态。seL4形式化验证相关论文。
其余的微内核系统:Fuchsia,Minix
Fuchsia是Google开发的一款全新操做系统,试图覆盖手机,平板,甚至笔记本等一系列领域。Google为该系统配备了Vulkan图形接口,3D桌面渲染Scenic,Flutter应用开发框架,还有一个称为zircon的微内核。zircon内核是从高通平台的一个Bootloader项目:Little Kernel发展而来。zircon内核属于微内核设计,只提供IPC,进程管理,地址空间管理功能。zircon区别于以进程或者以文件为核心的设计,zircon是之内存为核心来设计的,内存在zircon中是以对象的方式存在,能够经过channel通讯机制传递虚拟内存对象(Virtual memory object)的句柄,进程拿到句柄后能够把这块内存映射到本身的空间。
Minix系统则由荷兰阿姆斯特丹的Vrije大学的Andrew S. Tanenbaum教授所开发。该系统最大的特色是能够故障隔离,自动重启失败的服务。Minix使用分层设计,最底层的微内核提供中断处理,进程管理,进程通讯等服务,中间层提供轮回服务(Reincarnation Server),这一层运行在内核态;文件服务,进程管理,X图形服务以及驱动等,这一层运行在用户态;最上层为用户进程。其中轮回服务负责在中间层的服务出现崩溃时重启这些服务,从而保证服务的自我修复。Minix因为其自我修复特性被英特尔管理引擎(ME)所选用,该管理引擎主要负责管理英特尔芯片的内部模块。
微内核的优缺点
优势
系统服务模块化,可移植性高;
内核安全性提升(模块内部的bug不影响内核稳定,将黑客利用软件漏洞形成的破坏限制在单个模块内部);
能够多套系统服务共存,至关于同时运行多种操做系统;
稳定统一的接口(能够独立维护私有驱动以及服务,不须要跟内核源码绑定);
在商业上,微内核能够避免代码受到一些开源协议的影响,好比GPL协议。
内核精简,能够进行形式化验正,利用数学证实内核的安全性;
数学可证实的实时性;
很是适合多处理器系统设计,在多处理器核心计算机上,互相依赖的系统服务能够同时运行;
缺点
经过进程通讯的方式交换数据或者调用系统服务,而不是使用系统调用,形成额外的操做系统开销。
使用一些频繁使用的系统服务时,好比网络收发数据,形成的进程上下文切换对操做系统来讲也是一个负担。
因为系统服务高度模块化,系统服务之间存在大量的内存复制。
对互相之间存在复杂调用关系的系统服务,难以设计通讯接口。
系统服务与内核在地址空间上分离,形成代码局部性差,下降了cache命中率。
RT-Thread线上活动
一、【RT-Thread能力认证考试12月——RCEA】通过第一次考试的验证,RT-Thread能力认证获得了更多社区开发者和产业界的大力支持!(点此查看)若是您有晋升、求职、寻找更好机会的须要,有深刻学习和掌握RT-Thread的需求,欢迎垂询/报考!
能力认证官网连接:https://www.rt-thread.org/page/rac.html(在外部浏览器打开)
当即报名
#题外话# 喜欢RT-Thread不要忘了在GitHub上留下你的STAR
哦,你的star对咱们来讲很是重要!连接地址:https://github.com/RT-Thread/rt-thread
你能够添加微信18917005679为好友,注明:公司+姓名,拉进 RT-Thread 官方微信交流群

RT-Thread
让物联网终端的开发变得简单、快速,芯片的价值获得最大化发挥。Apache2.0协议,可免费在商业产品中使用,不须要公布源码,无潜在商业风险。
长按二维码,关注咱们


点击阅读原文进入GitHub
本文分享自微信公众号 - RTThread物联网操做系统(RTThread)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。