内核的作用:
1、直接控制CPU和内存:
计算机可以同时运行很多软件做很多事,这叫做多进程(Multi-process)或者多任务(Multi-tasking),那么操作系统就要能够实现多个任务的管理和安排,还要负责多个任务之间的协作通信。一般的,主要包含:
Virtual memory,将内存虚拟化以供应用程序使用。
Task Schedules,任务排程。
IPC,Inter-process communication,进程间通信。
2、服务功能:
应用程序可以调用这些服务来实现各种功能,比较基础的操作系统服务有:
l File System,文件系统,保存和读取文件。
l Network,网络服务,让应用程序可以联网。
l Graphic,图形服务,提供屏幕上显示图形的能力。
l GUI,界面服务,提供界面工具按钮显示。
当然还有很多其他的,这里就不一一列举了。
3、支援更多设备驱动:
比如增加了一个摄像头,操作系统要确保这些设备能够被应用程序使用起来才行。其实就是要对各种硬件的驱动进行管理,就是Device driver设备启动服务。
微内核操作系统
微内核将传统宏内核中的驱动程序,甚至包括许多功能,比如文件系统, 网络, GUI等等, 都变成用户态的进程(服务),而内核中只保留最重要的功能: 进程管理,内存管理, 进程间通信, 以及硬件抽象层(HAL).
微内核的劣势:
l 性能问题。Kernel mode和User mode之间的切换更加耗时,比起把各种功能都打包在一起的宏内核,微内核需要太多的切换,这直接导致性能底下。当然现在无论是算法改进还是CPU支持都有了很大的进步,基本上可以说现在已经不是大问题了。
l 极致原则。微内核一直努力遵循“内核应该极小化”的原则(minimality),这让很多微内核研究者和开发者收到了束缚,在时代允许的硬件环境下难以对性能进行有效优化。
l 缺乏大企业支持。当然这也和微内核当初性能不佳有关。
微内核的优势
l 易于维护和升级。把众多的服务功能和设备驱动从内核代码中分离出来,如果只需要对某些功能进行改进,这样无论是改代码还是增加新功能,都不用去变动原来的核心代码,当然效率高。
l 系统更加稳定。只要微内核的关键功能代码不出问题,系统就不会崩溃。比如说如果文件服务代码运行时候出了问题,宏内核因为文件服务代码是放在kernel mode的,直接就系统崩溃蓝屏了。而微内核的文件服务代码是放在user mode的,只要运行在kernel mode的代码直接把文件服务功能强行停止然后重启就可以继续使用了,系统不会蓝屏。
l 系统更加安全。微内核除了把额外的功能划出kernel mode之外,还改变了任务之间的权限管理模式,它并不能像宏内核那样直接给用户安装的APP授权访问关键功能和各种服务、驱动,而是依赖于不断的传递带有授权信息的handle对象来实现授权,这虽然很繁琐,但安全性无疑要比宏内核高很多。
l 系统更加可定制。宏内核把所有驱动和服务都打包在内核里难以拆分,如果需要开发一个不需要网络功能服务的操作系统就比较麻烦了。而微内核中各种服务都是单独的,直接去掉很容易。这对当前越来越多样化的小型智能硬件操作系统的开发非常有用。
l 分布式计算。因为微内核把各种服务和驱动都单独开来,这就允许让各种系统服务运行在不同的芯片、不同电脑上面,让很多台计算机一起来运行同一个操作系统,这对分布式计算和云计算提供了更多可能。
可载入核心模块Loadable kernel module
为了减轻kernel内容,很多宏内核操作系统(windows、安卓等)直接把某些功能服务移到核心外面,只在需要使用的时候再加载进来,这些模块就称作可载入核心模块。
当前大部分类Unix操作系统(Unix-like)和微软操作系统都支持可载入核心模块。
保护环Protection ring
这里是指计算机CPU芯片在运行代码时候的权限控制机制。kernel核心代码运行在最高权限,Applications应用程序代码运行在最低权限。
学术界较为推崇但是目前还没有的操作系统内核 :外核
外核
外核更小,比微内核还要小。外核的目标是让应用程序获得最多的控制硬件的自由,就是让开发者对硬件控制更深,以便于开发出性能更好的应用程序。
在外内核的基础之上,应用程序Program和库文件Lib一起直接实现应用程序+操作系统的功能,称之为库LibOS,它直接以最高权限运行,不存在kernel mode和user mode的区别,也去除了所有的冗余,体积小,性能强。
如果我们把应用程序program和库lib再深一步联合打包成操作系统,那么它甚至可以脱离外核而直接运行在物理硬件设备上,或者通过hypervisor超级管理员程序来激活运行,那么这样的系统我们叫做Unikernel。
外核操作系统减少传统概念,即操作系统必须提供构建应用程序的抽象内容。该方法实现了应用级资源管理,即由应用程序而不是操作系统管理硬件资源。这时,进程间通信、虚拟内存管理等抽象概念都是单个应用实现的。因此,可以将这些应用作为库操作系统(LibOS)使用。被称为外核的最小核心安全可靠的为多个LibOS提供了有用的硬件资源。