Skip to content

Latest commit

 

History

History
72 lines (55 loc) · 9.86 KB

2016-03-15-aosDune.md

File metadata and controls

72 lines (55 loc) · 9.86 KB
layout title categories tags
post
Dune:Safe User-level Access to Privileged CPU Features阅读报告
technology
technology

##Dune:Safe User-level Access to Privileged CPU Features阅读报告

背景

随着大量的应用想要获得访问硬件特性的权限,而访问硬件的权限只有内核能够进行。 这些应用有,Azul Systems,如果它能够访问处理硬件页表,这将对于该应用的垃圾回收有很大需求,当然,也有一些应用直接定制在内核的操作系统层,比如IBOS,它把浏览器抽象移植到操作系统层,加强浏览器的安全性。 但是这样的系统需要对操作系统内核进行修改,内核的修改会影响整个系统的稳定性。解决这个问题的另外有一种策略是在虚拟机上面运行一个应用程序的镜像,但是这种方法的弊端是使用虚拟机不能与主机操作系统有很好的交互, 没法实现进程之间的IPC通信,另外,为特定应用的虚拟机开发一个内核也不是一件简单的事情,在虚拟内存层面实现一个特定用途的内核非常具有挑战性。文章中对于上面的问题提出了一个方案就是使用硬件虚拟化来提供一个进程。 作者在64-bit intel cpu上面的linux内核下实现了该模块Dune。

###原理

Dune给普通的用户应用程序一个对于CPU特性的安全高效的访问权限,而一般传统情况只有操作系统才能对内核进行访问。 它通过充分利用现代硬件虚拟化,使得在一个并非特权级别的情形下直接执行特权指令,使用Intel的VT-x虚拟化架构将异常,虚拟内存,特权模式,和分段机制的访问使用权限暴露出来。 通过在用户级使得这些硬件机制可以访问使用,Dune使得不用对内核进行专门的修改就可以部署全新的系统这种情形变得很方便。这种对于linux是一个可扩展的模块,使用硬件虚拟化技术使得应用程序可以访问很多硬件特性, 比如特权级模式,虚拟内存寄存器,页表,和中段,异常和一些系统调用,我们提供了一个用户层次的库来促进这些特性的使用。使用Dune有几大优势,应用易于开发,不需要接触内核编程,另外这个模块简单而且快。 主要的创新之处在于使用了虚拟化技术把硬件特性安全高效的展示给应用程序。对于异常,页表和特权级进行了评估,也使用了一些应用进行了验证。 硬件的虚拟化使用了x86cpu和intel VT-x,VT-x是Intel公司对于x86 ISA的虚拟化扩展,它将CPU分成两种操作模式,分别是VMX root和VMX non-root模式。 VMX root 模式通常用来运行虚拟内存管理,除了使能新的指令来操作VT-x并不改变CPU的性能,而VMX-non root 模式限制CPU性能用来运行虚拟化的客户操作系统。 在两种模式的转换是依靠硬件管理的,当虚拟内存管理执行VMLAUNCH或者vmresume指令,硬件执行到了VM入口,将CPU置于VM –non root模式并且执行客户端。 然后,当操作由虚拟内存管理操作的时候,硬件执行VM exit,将CPU置于 VMX root 状态,并且跳到VMM入口处,硬件自动的保存和恢复大多数的系统状态在这两种转换中,这使用常驻内存的数据结构VM 控制结构完成。 配置VMCS可以使得Guest程序访问页表root寄存器 CR3。并且Vt-x包含一个专用的硬件机制叫做扩展页表(EPT),它可以强制guest内存和直接解除虚拟内存进行隔离,这样保证了guest不能接触全部的内存地址。 Dune使用VT-x提供了用户程序全部的权限来接触x86保护硬件,包括三个特权级硬件特征:异常,虚拟存储和保护模式。支持异常对于模拟,调试和性能追踪程序很有用,用户程序也受益于快速灵活的解除虚拟内存,比如在垃圾回收中很有用。 在内核支持方面,Dune的核心是一个管理Vt-x内核模块,对于高优先级的硬件特性有更高的权限,在管理内存,暴露特权级硬件的接口和保留访问内核接口的权限。

如图所示,在Dune下面的进程可以通过libDune运行在ring0态,属于VMX non-root,而正常进程是运行在ring3态 VMX root。

随着大量的应用想要获得访问硬件特性的权限,而访问硬件的权限只有内核能够进行。 这些应用有,Azul Systems,如果它能够访问处理硬件页表,这将对于该应用的垃圾回收有很大需求,当然,也有一些应用直接定制在内核的操作系统层,比如IBOS,它把浏览器抽象移植到操作系统层,加强浏览器的安全性。 但是这样的系统需要对操作系统内核进行修改,内核的修改会影响整个系统的稳定性。解决这个问题的另外有一种策略是在虚拟机上面运行一个应用程序的镜像,但是这种方法的弊端是使用虚拟机不能与主机操作系统有很好的交互, 没法实现进程之间的IPC通信,另外,为特定应用的虚拟机开发一个内核也不是一件简单的事情,在虚拟内存层面实现一个特定用途的内核非常具有挑战性。文章中对于上面的问题提出了一个方案就是使用硬件虚拟化来提供一个进程。 作者在64-bit intel cpu上面的linux内核下实现了该模块Dune,Dune给普通的用户应用程序一个对于CPU特性的安全高效的访问权限,而一般传统情况只有操作系统才能对内核进行访问。 它通过充分利用现代硬件虚拟化,使得在一个并非特权级别的情形下直接执行特权指令,使用Intel的VT-x虚拟化架构将异常,虚拟内存,特权模式,和分段机制的访问使用权限暴露出来。 通过在用户级使得这些硬件机制可以访问使用,Dune使得不用对内核进行专门的修改就可以部署全新的系统这种情形变得很方便。这种对于linux是一个可扩展的模块,使用硬件虚拟化技术使得应用程序可以访问很多硬件特性, 比如特权级模式,虚拟内存寄存器,页表,和中段,异常和一些系统调用,我们提供了一个用户层次的库来促进这些特性的使用。使用Dune有几大优势,应用易于开发,不需要接触内核编程,另外这个模块简单而且快。 主要的创新之处在于使用了虚拟化技术把硬件特性安全高效的展示给应用程序。对于异常,页表和特权级进行了评估,也使用了一些应用进行了验证。 硬件的虚拟化使用了x86cpu和intel VT-x,VT-x是Intel公司对于x86 ISA的虚拟化扩展,它将CPU分成两种操作模式,分别是VMX root和VMX non-root模式。 VMX root 模式通常用来运行虚拟内存管理,除了使能新的指令来操作VT-x并不改变CPU的性能,而VMX-non root 模式限制CPU性能用来运行虚拟化的客户操作系统。 在两种模式的转换是依靠硬件管理的,当虚拟内存管理执行VMLAUNCH或者vmresume指令,硬件执行到了VM入口,将CPU置于VM –non root模式并且执行客户端。 然后,当操作由虚拟内存管理操作的时候,硬件执行VM exit,将CPU置于 VMX root 状态,并且跳到VMM入口处,硬件自动的保存和恢复大多数的系统状态在这两种转换中, 这使用常驻内存的数据结构VM 控制结构完成。配置VMCS可以使得Guest程序访问页表root寄存器 CR3。并且Vt-x包含一个专用的硬件机制叫做扩展页表(EPT),它可以强制guest内存和直接解除虚拟内存进行隔离, 这样保证了guest不能接触全部的内存地址。Dune使用VT-x提供了用户程序全部的权限来接触x86保护硬件,包括三个特权级硬件特征:异常,虚拟存储和保护模式。支持异常对于模拟,调试和性能追踪程序很有用,用户程序也受益于快速灵活的解除虚拟内存, 比如在垃圾回收中很有用。

在内核支持方面,Dune的核心是一个管理Vt-x内核模块,对于高优先级的硬件特性有更高的权限,在管理内存,暴露特权级硬件的接口和保留访问内核接口的权限。

如图所示,在Dune下面的进程可以通过libDune运行在ring0态,属于VMX non-root,而正常进程是运行在ring3态 VMX root。

对于Dune的内存管理,目标是提供一个默认的进程内存地址空间,允许用户程序添加功能而不是替换内核级别的内存管理,主机虚拟内存地址是平常的虚拟地址,这仅仅在内核态和普通进程态使用。当进程使用Dune的时候,一个用户控制页表s使映射guest虚拟地址到物理地址。而EPT使得可以从guest-phisical地址映射到host-physical地址

###评估和相关工作

要访问虚拟内存需要有对于CR3寄存器的权限,它可以在VMCS中被允许。在操作系统的接口上,进程必须使用VMCALL,这样的超级调用指令,来做系统调用。 在系统实现的评测中,能够看到在getpid,pagefault这样简单的调用中,在linux下面的效率比Dune高,这是因为逻辑简单的程序运行时候的开销量凸显在root态和non-root态的切换了,而对于ptrace trap等程序Dune比linux快得多,这是因为直接访问硬件指令使得程序运行效率高了很多。当然这样的体系也有缺点,在sandbox测试中可以看到当页表增大到2MB的时候性能才相差不大。网络Io的性能也相对没有什么改善。 至于相关的工作,有不少工作都是在给应用程序硬件指令访问权限,比如通过底层内核接口来暴露硬件指令,但相比而言,Dune没有去修改或者覆盖原有的操作系统。