微内核进行开发工作究竟是怎样的感受?
微内核进行开发工作究竟是怎样的感受?
- 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 混合微内核的发布,具体能够有哪些东西值得关注,我后面再慢慢细说。我不敢说这个是一个极其好用的东西,但是我觉得至少走出了第一步,这也是一个突破。更多的功能完善,更加稳定的实现细节可能需要的是更多的努力吧,还有需要更多人的智慧,才能不断推进技术走向更高的高峰。
- END -
- ModelBinder——ASP.NET MVC Model绑定的核心
- 一句代码实现批量数据绑定[下篇]
- 三种属性操作性能比较:PropertyInfo + Expression Tree + Delegate.CreateDelegate
- 解密Myspace密码的姿势
- weblogic安全配置二三事
- 开发自己的Data Access Application Block[下篇]
- 【CSS】格仔背景
- 这年头真的还有USB设备是安全的吗?
- js的动态加载、缓存、更新以及复用(一)使用范围:遇到的问题:目标:页面结构:正文
- js的动态加载、缓存、更新以及复用(二)恼人的命名冲突
- 以【猫叫、老鼠跑、主人醒】为例子,使用 javascript 来实现 观察者模式 (有在线演示)
- Debian/Ubuntu-shell脚本来管理iptables安全策略
- Pegasus间谍套件内部原理及流程剖析
- 用node.js实现ORM的一种思路
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- php项目中类的自动加载实例讲解
- Yii框架参数配置文件params用法实例分析
- 使用Kotlin实现文字渐变TextView的代码
- thinkPHP5框架路由常用知识点汇总
- PHP实现一个限制实例化次数的类示例
- AndroidStudio中重载方法@Override的使用详解
- mysqli扩展无法在PHP7下升级问题的解决
- PHP通过文件保存和更新信息的方法分析
- PHP中将一个字符串部分字符用星号*替代隐藏的实现代码
- PHP创建XML的方法示例【基于DOMDocument类及SimpleXMLElement类】
- android之json数据过长打印不全问题的解决
- PHP实现时间日期友好显示实现代码
- AndroidStudio插件GsonFormat之Json快速转换JavaBean教程
- android studio错误: 常量字符串过长的解决方式
- Android Shader着色器/渲染器的用法解析