微内核进行开发工作究竟是怎样的感受?
微内核进行开发工作究竟是怎样的感受?
1.本文目的
2.微内核的差异性
3.微内核该怎么写应用程序?
4.微内核的效率和实时性怎么样?
5.如何客观的评价RT-Thread Smart混合微内核?
1.本文目的
随着RT-Thread Smart微内核发布会的临近,对于开源社区以及国产RTOS比较关注的人或许早有耳闻。RT-Thread要发布微内核操作系统了。从去年的华为提出鸿蒙微内核到目前为止,都未曾真正见到一个微内核系统面向大众。从真正的开发者角度来看,或许真正的关注点不在于多少先进技术的提出,而实际的关注点在于是否好用,是否能够快速高效的开发出稳定的产品,是否用上了之后能够减少自己的工作量。本文主要从微内核开发的思维角度出发,谈一谈RT-Thread Smart以及我个人进行微内核开发工作的所思所想。
2.微内核的差异性
内核是操作系统中管理资源的核心部分,它充当着计算机程序与硬件之间桥梁。
其实在程序运行时,用户态程序想要访问外设,必须要通过内核进行资源调度,然后进行统一的管理。现在许多CPU中,最基本的都会有用户模式和超级管理员模式两种。用户程序首先必须要有可以自己管理的一段内存空间,进行业务逻辑的设计,如果要使用到共享资源或者硬件资源时,那就需要通知内核,此时内核进行调度和分配,在合适的时机给申请资源的应用程序。如果访问特殊的寄存器,这时候,还需要切换CPU的模式,从而访问超级管理员才能使用的寄存器。
这种权限的控制核心都是由内核进行,用户态程序申请访问内核资源的时候,通常是通过软件中断的形式实现,这会导致硬件的中断处理程序将控制权转移到作为操作系统一部分的适当的中断处理程序上,在进程中将模式位转换为内核模式。中断处理程序检查生成了哪个中断,如果合适,检查附加参数(通常通过寄存器传递),然后调用适当的内核服务例程来处理系统调用请求的服务。
此时如果用户程序访问了非法指令,或者访问了本不该自己访问的东西,也会产生软件中断,从而将事件交给内核处理,内核进行保存错误日志,并负责清理垃圾。
上述也仅仅介绍了内核态与用户态的基本工作流程,微内核基本也是沿用了这套思想,但是微内核体现的正是这个微的特定。为了体现微这个特点,微内核一般只会提供最少的进程和内存管理的服务,客户端程序与应用程序只在用户地址空间之间进行消息的传递,这样并不会影响内核的功能,但是这样的方式会大大增加消息传递的负载,也就是说,大量的消息传递也会降低系统的运行性能。但这些牺牲带来的好处也是显而易见的,对开发者来说非常的方便,不用过分关注内核的稳定性问题,只需要好好处理上层的业务逻辑即可。
3.微内核该怎么写应用程序?
微内核的应用程序部分一般不需要过度的去关注内核部分的代码,就像我们进行Linux开发应用程序一样。首先应该充分的相信微内核内核部分的可靠性,如果一出问题就总是怀疑内核是不是有BUG那就不太适合进行微内核的开发工作。我们在开发Linux的时候,遇到问题,总不会把Linux的整个代码再review一遍,这样是费力不讨好。
所以进行微内核的开发工作,首先需要知道微内核提供的编程规范,以及所提供的API函数进行程序设计。其实在C语言中,也是会提供一些标准库函数的,比如RT-Thread Smart中提供的musl库等等。当然还有不同微内核系统中所提供的专用的API,比如对RT-Thread比较熟悉的人,在上手RT-Thread Smart时,也能够找到很多之前用到的函数API的接口的影子。
而APP的编译是独立的,只需要交叉编译工具链,将程序链接到指定的入口地址,无论是通过makefile还是scons或者CMake都做不做限制,编译出来的程序,微内核通过加载器加载到内存中去执行程序。
另外编写应用程序需要注意的是不同线程之间的消息传递机制,以及线程与进程之间的关系。这个是非常值得关注和思考的问题。
4.微内核的效率和实时性怎么样?
我觉得微内核的实时性是弱于RTOS强于LInux的,之所有有这样的结论,是因为微内核确实会存在大量消息传递机制传递消息的问题。对于直接进行处理事件的RTOS来说,这样的方式必然会降低系统响应的速度。如果业务逻辑简单倒是看不到很明显的差异,但是一旦涉及到任务量大,应用程序很多的情况时,内核的负载太大了。
例如在用户态进行网络协议栈的处理上来说,如果说驱动在内核层,网络协议栈在用户层,数据将直接从内核驱动过来,然后通过消息传递机制比如共享内存传递到用户态,用户态接收到通知,然后再拷贝数据,处理数据,然后通过系统调用,又将处理好的数据传递到内核层。这个过程涉及到太长的链路,一定会影响系统的性能。但是如果驱动在应用层,那也需要大量的消息传递机制来确保两个进程间的通信的迅速以及准确。总体说起来,对于目前高性能的处理器来说,性能一般不是太大的瓶颈,架构的稳定与系统复杂度也是需要好好均衡的,鱼与熊掌不可得兼,舍鱼而取熊掌者也,至于其中的利弊,个人来做评判与选择。
5.如何客观的评价RT-Thread Smart混合微内核?
从我的角度去看这个东西,或许是用瑕不掩瑜
这个词语概况比较恰当一点。凡事在开始阶段,都是在摸着石头过河,没有人会知道这个东西的真正面目是什么,也没有人彻底的能够描绘出它的全貌,所以开发的过程一步一步的进行的是挖坑再填坑的过程,刚开始没有轮子,然后慢慢有了一个轮子形状的东西,能转但是很奇怪,因为并不方正。然后慢慢的砍成一个方形的,之后慢慢磨,终于变成圆形的了,这时候就走的很顺畅了。我说的上述过程大概就是我做了一点微内核的开发工作的心路历程吧。
真正的做下来,没有什么尝试是毫无意义的。造不如买,买不如租
这种思维模式,收益的也只是眼前,从长远的大趋势上来看,唯有走在最前面的人,才能看得到最好的风景。这次RT-Thread Smart 混合微内核的发布,具体能够有哪些东西值得关注,我后面再慢慢细说。我不敢说这个是一个极其好用的东西,但是我觉得至少走出了第一步,这也是一个突破。更多的功能完善,更加稳定的实现细节可能需要的是更多的努力吧,还有需要更多人的智慧,才能不断推进技术走向更高的高峰。
本文分享自微信公众号 - 嵌入式IoT(Embeded_IoT)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
JUC并发组件CountDownLatch源码分析
前提 之前已经花了大量时间分析同步器框架AQS的源码实现,这篇文章分析一下CountDownLatch的源码实现,本文参看的JDK源码为JDK11,其他版本不一定适合。 ❝ CountDownLatch其实是复合名词,由单词countdown和latch复合而来。countdown是倒数的意思,而latch则是闩锁、闭锁的意思,复合词容易让人联想到预先设定一个计数值,并且"锁住(阻塞)"一些东西(线程),然后进行倒数,当数值减少到0的时候进行"放行(解除阻塞)"。 ❞ CountDownLatch是「AQS共享模式」下的典型实现。本文会先简单介绍CountDownLatch的基本API、类比监视器方式的实现以及深入分析其源码实现。 CountDownLatch的基本使用 CountDownLatch的基本API如下: //构造函数,要求初始的计数值要大于零publicCountDownLatch(intcount)......//当前调用线程会等待直到计数值倒数为0或者线程中断publicvoidawait()throwsInterruptedException......//当前调用...
- 下一篇
Rust 往事 | Loop 和 While True 之争
点击上方蓝字关注我们 理清头脑混沌,觉醒心智天地 我不太清楚「Rust 往事」会不会是一个系列,先建个专栏再说。 本来想把 「往事」限定于 1.0 版本之前,但又觉得太狭隘了。Rust 是一门不断向前发展的语言,所谓往事,我觉得应该是 Rust 在发展过程中,经历过的所有决策和讨论。 一切过往,皆为序章。 引子 我曾经一直想不明白一个问题:为什么下面代码中 while true 无法通过编译? fn main() { let mut a; while true { a = 1; break ; } println!("{}", a); // error[E0381]: borrow of possibly-uninitialized variable: `a`} 而将while true换为loop则可以通过编译: fn main() { let mut a; loop { a = 1; break ; } println!("{}", a);} 我清楚它们之间的区别,while true在编译期静态分析的时候和loop不太一样。 前者因为是 while 条件,所以编译器无法在编...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS8安装Docker,最新的服务器搭配容器使用
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS8编译安装MySQL8.0.19
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7设置SWAP分区,小内存服务器的救世主