外核通过底层接口将硬件资源暴露给不受信任的库操作系统,这可以显著的提升速度。 在外核操作系统中,大多数的基础内核操作可以比Ultrix快10到100倍,应用级虚拟内存和进程间通信原语要比Ultrix的内核原语快5到40倍。
应用通过系统定义的接口与物理资源交互,这种交互依赖于抽象模型,但抽象模型会严重地限制性能和应用实现的自由性。
同时硬编码模型也有三个坏处,这主要是由于只能在现有模型上做模拟造成的。
外核安全地复用物理资源,并提供给在他之上的库操作系统。库操作系统实现了一些高层抽象,应用开发者可以选择库或者自己开发。库和应用通过简单的重新链接来协作。
外核的设计基于这样的理念:越底层,越高效。因此外核设计基于这样一个简单的目标:分离保护和管理。
外核直接暴露物理资源,这使得应用可以简单高效的实现。为了安全的暴露资源,外核采用了三种方法:
由于硬件性能的快速提升和应用的多样化,原有的高层抽象已经变得不再合适。而保证这种抽象不变的代价就是降低性能,增加复杂性,限制程序功能。
由于某一一种对所有类型应用都适用的办法,所以固定的高层抽象需要考虑所有情况,但这必然就会使得某些类型的应用性能受损。
固定的高层抽象隐藏了底层信息,这使得应用很难简单地实现需要的功能,必须增加复杂性。
因为所有应用共用一种抽象,所以对抽象的改变很难。
应用比系统更懂得资源管理的目的是什么。所以系统应该尽可能多的把控制给应用程序。
内核只需要简单地安全地复用资源就可以了,这使得其实现会很简单。
库操作系统会提供可移植性和兼容性。使用外核接口的应用不能直接移植,因为接口包含硬件特定的信息。但使用库操作系统的却可以移植。同时库操作系统也可以被自由地替换而不需要特殊权限。库操作系统可以通过使用底层机器无关接口来获取可移植性。
扩展或者特化库操作系统可以通过模块设计变得简单。
外核可以通过三种方式提供向后兼容:
为了分离保护和管理,外核执行了三个重要任务:
为了实现上述任务,外核用了这三种方法:
安全暴露硬件。外核需要暴露所有特权指令、硬件DMA能力和机器资源。这一原则还应拓展到非物质的硬件资源上,如中断等。
这一原则说明,外核应该拒绝资源管理。这是由于设计者相信,分布式的、应用特定的资源管理是建造灵活高效系统的最佳方式。
后续原则解决这个目标的一些细节。
暴露分配。外核需要允许库操作系统请求特定硬件资源。库操作系统需要参与到每个分配决定。
暴露命名。外核应该暴露物理命名,因为物理命名去除了许多间接层,十分高效。
暴露回收。外核应该充分利用课间资源回收协议来使得库操作系统可以更有效地进行应用级资源管理。
尽管将资源管理交给了库操作系统,但是外核还是应该包含仲裁应用的重要性以及资源的分享。
外核最主要的一个任务就是安全的复用资源向不信任的应用提供保护。
安全绑定在两方面提升性能:
通过将理解语义的需求在绑定时分离,内核可以在访问时有效地实现访问检查而不需理解他们。
使用了三种技术实现安全绑定:
硬件机制是指硬件实现了权限检查。
软件缓存则是在内核内保存一个表,表中是应用和资源的关系。
代码下载是指,当内核事件发生时,执行下载到的代码。
对物理内存的安全绑定通过自我验证功能和地址翻译硬件实现。
为了确保保护,外核通过要求库操作系统提供请求访问的功能来保护对物理内存页的每次访问。由于处理器包含tlb,所以当应用尝试进入一个新的虚拟到物理映射时,外核必须检测内存。为了通过减少建立安全绑定的次数来提升库操作系统性能,外核可能会在一个大的软件的TLB中缓存虚拟到物理映射。
虽然由于地址翻译硬件不同,具体实现会有很大差异。但基本原则就是特权机器指令必须被外核监视。
网络复用可以在硬件和软件层面提供。
在作者的原型系统中,软件提供的信息多路分解可以通过包过滤器来提供。包过滤器是下载在内核内部的。
另一个问题是过滤器不会说谎,这个问题可以通过只允许可信服务器安装过滤器来解决。
共享信息发送网络接口非常简单,信息简单的从应用拷贝到转移缓存即可。
下载代码可以提升性能:
这种解耦可以让下载代码在不用上下文切换到应用程序的情况下被执行。
外核对大部分资源使用可见资源回收,甚至处理器都会在时间片的结束被显式回收。
资源回收过程可以被看做是外核和库操作系统的一个对话。
外核必须能够从没有对回收请求返回满意值的应用处取出资源。
到库操作系统没有响应回收协议的时候,外核简单的断开安全绑定,并通知库操作系统。
为了记录这个强制的资源丢失,作者在他的原型系统中使用了恢复向量。当外核从库操作系统那会资源的时候,会被记录在向量中,然后库操作系统会收到一个恢复意外,所以他能更新自己的资源映射。
因为有一些资源是非常重要的,所以需要确保每个库操作系统都有一些资源不能被夺取。如果就连这些资源也要夺取,那应该告诉库操作系统对自己提交一个交换服务器。
实验部分略去