UniKernel
最近了解到 UniKernel,觉得很有意思。UniKernel的思想是把一个系统的内核、驱动、网络堆栈、应用逻辑等以源码或者静态库的形式送进编译器,充分利用编译器的优化能力进行全局优化,以发挥硬件的最大性能。
我们日常使用的操作系统可以看作是一个提供C/C++动态链接库的运行时环境,而UniKernel是把操作系统的所有服务以静态库的形式提供给应用程序。开发UniKernel应用程序更像开发单片机应用程序,只能使用交叉编译。UniKernel应用也可以像嵌入式应用一样,可以裁剪一些不必要的功能,但是UniKernel最后生成的程序是只运行在一个地址空间里,没有内核空间和用户空间,没有多进程的概念。
UniKernel在1990年就有人提出来了,但是并没有在桌面市场和服务器上得到大规模应用,主要原因可能包括:
1、早期的硬件市场竞争激烈,技术发展迅速,驱动程序的接口还不稳定,厂商也不愿意开源全部的驱动程序
2、编译器技术还不够发达,编译器的优化不明显
3、UniKernel模式的系统在需要添加功能时需要重新编译安装整个系统,远不如传统操作系统灵活。
虚拟化技术通过虚拟的标准硬件解耦了物理硬件驱动程序和操作系统。传统操作系统提供了解耦应用程序和驱动程序的API/接口。在云计算时代初期,大家还是按照传统的模式,在虚拟机里先安装操作系统,应用程序先访问操作系统的API,操作系统通过虚拟硬件的驱动程序访问虚拟机监视器模拟的标准化虚拟硬件,虚拟机监视器再通过驱动程序访问的物理硬件。虽然有写时复制、DMA、各种直通技术等可以避免一些层层转发的性能损失,但是还是有人相信:不调用操作系统提供的API,直接在编译时集成虚拟硬件的驱动源码可以使应用程序跑得更快。现在这两种技术路线开始了竞争。第二种路线就是UniKernel。还有一些传统操作系统提供的服务也逐渐被云服务或者新技术替代,比如块储存替代了文件系统。
开源的Unkikernel项目有:
HermTux https://ssrg-vt.github.io/hermitux/
#includeOS:https://github.com/includeos/IncludeOS
rusty-hermit: https://github.com/hermitcore/rusty-hermit
Mirage:https://github.com/mirage/mirage
UniKernel 的直接竞争者是容器docker, 只是无论是unikernel 还是docker并不能完全替代传统的操作系统,只是我们可以开始反思,我们的应用真的需要那么一个大而全的系统吗?开发UniKernel应用程序更像开发单片机应用程序。