1 概述
随着虚拟化技术研究的深入,系统虚拟化技术已在X86体系架构上获得了很好的发展,在企业计算、灾难恢复、分布式计算、桌面虚拟化领域均得到了广泛应用。在信息安全领域,因系统虚拟化层介于硬件平台与用户操作系统之间,其特有的客户机操作系统监控和隔离作用,使得系统虚拟化技术不仅可以用于服务器端实现资源整合与管理功能,也可以增强以操作系统安全为核心的用户终端系统的安全性,因此,虚拟化技术在信息安全领域也备受关注。在国内,系统虚拟技术在信息安全领域的技术研究开展得比较多,目前在硬件资源访问控制、操作系统恶意行为监控、隐藏进程检测等方面已有相关的研究。主要的思路是在虚拟机监控器(Virtual Machine Monitor,VMM)中构筑一系列的安全防护措施,强化对客户机操作系统的安全监控与管理,但此类技术的应用研究目前还处于起步阶段,尚无完整的应用实现方案。
本文借鉴国内外当前相关技术的研究成果,结合个人终端操作系统安全防护实际需求,提出了一种适用于个人终端计算机、基于虚拟技术的操作系统安全增强模型。根据该模型在终端安全领域应用推广中将会面临的显卡性能问题,提出一种提高虚拟机显示性能的显卡透传技术,并基于KVM虚拟机研究了显卡透传技术的具体实现。
2 操作系统安全增强模型
在个人终端操作系统安全增强方面,需要做到既能维护系统的安全性,又需要保证系统的易用性和高效性。根据这个需求特点,通过改造现有虚拟机体系结构,提出个人终端操作系统安全增强模型。传统系统虚拟化体系模型如图1所示,改造后的操作系统安全增强模型体系结构如图2所示。
图1 传统系统虚拟化体系模型
图2 基于虚拟化技术的操作系统安全增强模型
在基于虚拟技术的个人终端操作系统安全增强模型上,一台PC机只运行一个独立的虚拟客户机操作系统,该系统对于用户来说就是普通的用户操作系统。虚拟机监控器则成为安全监控器,负责根据访问策略隔离与控制客户机操作系统对硬件资源的访问权限,可以根据安全性需要将不存在安全隐患的硬件(显卡、声卡、键盘、鼠标等)透传给客户机操作系统直接控制,对存在安全隐患的硬件资源(如网卡、USB端口)进行虚拟,在虚拟层实施访问过滤等检测措施确保访问安全;同时通过在虚拟化层实现进一步的恶意行为检测、隐藏进程检测等安全模块,对客户机操作系统各种恶意行为进行监控。
相比于通用虚拟机体系结构,这种安全模型中虚拟机监控器的主要职能不再是多虚拟环境的调度与切换,而转变为对单一虚拟机的安全监视功能,简化了传统系统虚拟化体系结构的复杂性,增强了操作系统安全性控制功能。
这种安全模型的推广应用,要求虚拟机下的客户机操作系统应具备与运行于真实主机上的操作系统相同或相近的性能与通用性,否则终端用户无法接受因安全增强而带来的性能或易用性方面的损失。自2005年Intel和AMD公司分别发布了支持虚拟化技术(Virtualization Technology,VT)的CPU以来,基于支持VT技术的CPU虚拟化技术已经让虚拟机处理性能产生了质的提升,能够达到真实主机性能的95%以上,CPU处理性能已经不再是虚拟化技术在终端安全领域发展的绊脚石。而显卡显示性能问题则成为当前虚拟化技术在终端安全领域发展的关键问题,当前国外主流的虚拟机软件都没能很好地解决显卡虚拟化问题,虚拟机的图形显示处理能力只相当于当年的386时代的水平,这使得虚拟机中的客户机操作系统不能运行一些对图形处理能力要求高的应用,这种安全模型的进一步发展存在着较大障碍。将基于KVM虚拟机研究实现提升客户机操作系统显示性能的具体实现方法,本文的研究主要是基于KVM虚拟机进行的,但相关技术原理具有普适性,也可在其他开源虚拟机上得到实现。
3 KVM虚拟机
当前,主流的商业虚拟机有VMware和VirutalPC,开源虚拟机有Xen、Qemu、Bochs、KVM等。KVM(Kernel-basedVirtual Machine)是一个基于Linux内核、依赖CPU硬件虚拟化技术(如Intel或AMDVT技术)的开源系统虚拟化模块。KVM虚拟机的体系架构如图3所示,VMM虚拟机监控器借助于Linux操作系统的内核实现。
图3 KVM虚拟机原理
KVM虚拟机支持PCI透传技术,可以实现将PCI硬件资源直接映射到虚拟机的客户操作系统中,客户操作系统可以直接驱动真实的标准PCI物理设备以获得高速物理资源访问。但KVM虚拟机支持PCI透传技术还必须依赖于硬件平台支持Intel或AMD的VT-d/IOMMU技术。VT-d/IOMMU技术在服务器虚拟化中对I/O虚拟化具有重要作用,但在终端用户的操作系统安全增强模型中却并不重要。此外,VT-d/IOMMU技术主要面向服务器设计,普通PC机上支持不多。因此,在基于KVM虚拟机的操作系统安全加固模型中实现显卡透传主要有2个方面的研究工作:(1)研究在不支持VT-d/IOMMU技术的硬件平台上实现PCI透传的方法;(2)实现对显卡这种特殊的PCI设备在虚拟机中的直接分配。
4 直接地址映射技术
4.1 基本原理
在虚拟机中实现PCI透传,需要处理好4个方面的问题:(1)PCI配置空间映射;(2)PCI内存及I/O资源映射;(3)PCIIRQ中断映射;(4)DMA(直接内存访问)处理。
在通常情况下,对于标准PCI设备,前3个方面的处理均可以通过虚拟机相应的软件映射机制实现,而对客户机操作系统的物理硬件DMA的处理则是现有的虚拟方式下难以用软件实现的,这与DMA本身的技术机制有关。
DMA是外设与系统进行高速数据传输的技术,外设可以不经过CPU直接进行内存读写访问,传输数据高效。在DMA传输时驱动需要申请一个可被DMA访问的地址空间,然后告诉外设可进行DMA传输的内存物理地址。这种方式在物理主机上没有任何问题,操作系统会保证分配给驱动的地址空间独立性。但在虚拟机上,因采用影子页表机制实现多个客户机物理地址到主机物理地址的映射,驱动从系统中获取的物理地址实际上是经过虚拟机转换后的客户机物理地址(GPA),并非对应真实的主机物理地址(HPA)。如果外设直接存取该地址的数据必然导致系统崩溃或造成安全隐患。Intel的VT-d和AMD的IOMMU技术则是从硬件层面解决DMA处理问题的有效办法。
与CPU上的Intel VT-x 技术一样,VT-d(VirtualizationTechnology for Directed I/O)技术是一种基于北桥芯片的硬件辅助虚拟化技术,通过在北桥中内置提供DMA虚拟化和IRQ虚拟化硬件,实现了新型的I/O虚拟化方式。运用VT-d技术,虚拟机得以使用直接I/O设备分配方式或者I/O设备共享方式实现PCI设备透传,从而大幅提升了虚拟化的I/O性能。AMD与之类似的技术称为SVMIOMMU。
Intel的VT-d和AMD的IOMMU技术支持DMA虚拟化的主要原理是由硬件维护一张DMA重映射表,当外设对某个物理地址进行DMA操作时,自动查找映射表,将操作地址映射为虚拟机内GPA对应的真实HPA,以避免错误的内存地址操作。该技术具有通用性,可以支持多个虚拟机同时进行物理设备透传,且互相不影响,但需要有主板芯片组支持才能使用,对硬件依赖性较高,KVM虚拟机已支持基于VT-d技术的PCI设备透传。但在终端操作系统安全加固模型中,不需要对多虚拟机同时进行物理设备透传,因此,并不需要维护一张一对多的DMA重映射表,只需要处理好GPA等于HPA的问题,即可有效确保硬件对DMA地址处理的合法性,使得虚拟机对物理硬件具有与真实主机一致的效果。本文针对DMA处理问题,提出了虚拟机与物理主机直接地址映射技术的解决方案。
4.2 实现方式
直接地址映射是通过将真实系统中低地址内存直接分配给虚拟机使用,直接让虚拟机的GPA对应主机HPA的技术。直接地址映射技术可以不需要任何硬件辅助,做到DMA访问的物理地址内存与主机一致。但该技术的缺点是,一个主机系统中只能同时运行一个进行物理设备透传的虚拟机,多个虚拟机同时进行物理设备透传则会造成地址冲突。
KVM是基于Linux操作系统运行的。实现直接地址映射的先决条件是需要Linux操作系统在启动时将低地址内存空间预留出来。为保证体系兼容,X86架构下的低1MB内存空间在操作系统初始化前就已预留给实模式中断向量表、BIOS数据、显存等使用,不能在Linux上预留这部分空间,只能从1MB以上的空间开始预留。对于2.6内核,有一个PHYSICAL_START变量设置系统启动时内核加载地址,缺省指向地址0x100000(1MB)处,可以修改为更大的值让系统在启动时空出1MB到PHYSICAL_START地址之间的内存空间,然后将这部分空间标记为预留,以避免操作系统启动后占用这部分空间。
从操作系统层面预留的这部分空间是无法直接在应用层直接使用的,目前通过Linux下/dev/mem设备文件直接将预留内存映射到应用层QEMU为虚拟机分配的内存空间中,映射时需注意确保HPA与GPA的对应。而对于虚拟机的其他内存空间,无需与物理地址对应,依然采用影子页表机制将虚拟机内存地址映射为Linux分配给QEMU的内存空间中。具体映射关系如图4所示。从图中可以看出,在成功实现内存映射后,客户机操作系统所使用的内存实际对应到了主机的真实内存部分,映射时确保了地址的一一对应。而虚拟机前640KB内存空间均由QEMU进行虚拟,占用的是Linux操作系统的内存空间。考虑到运行态主机的VGABIOS内存空间存储的是被修改过的BIOS代码,因此,虚拟机中VGABIOS内存空间均由QEMU进行虚拟,也占用的是Linux操作系统的内存空间。
图4 直接地址映射下虚拟机内存与物理内存的对应关系
5 显卡直接分配
从KVM虚拟机结构中可以看出,如果虚拟机需要访问QEMU模拟出的外设,则需要通过多次处理,才能够将数据真正传递给真实硬件设备处理。这对于普通低速接口的硬件外设访问来说虚拟化处理开销还容易接受,但对于显卡虚拟化来说性能问题将显得尤其突出。因此,采用显卡直接分配技术将物理显卡单独分配给一个虚拟机独占访问,使虚拟机上的客户端操作系统直接驱动物理显卡,进行MMIO访问和DMA操作,是一个在虚拟环境中获得高质量图形显示效果的有效解决方案。图5是显卡直接分配技术与QEMU直接虚拟外设的处理对比。从图中可以看出,显卡直接分配给虚拟机的客户操作系统还可以使得客户机操作系统充分利用物理显卡原始驱动实现显卡效能的最大化发挥。
开源的KVM虚拟机目前已经支持对标准PCI设备的直接透传(需要硬件具备I/O虚拟化能力,即需要硬件对VT-d或IOMMU技术的支持),但还没能够支持显卡的直接透传。主要有2个方面原因:(1)因历史遗留问题,X86体系架构下的显卡设备为实现兼容,留下了一些不同于标准PCI设备的内存和I/O端口;(2)因显卡自身高速处理需要,各显卡厂商可能会有一些特别的设计(如独立显存和共享显存的设计、特殊访问接口等),针对显卡不能完全像标准PCI设备一样简单地实现设备直接透传。
图5 显卡直接分配与QEMU虚拟外设技术对比
借鉴XEN虚拟机下基于VT-d技术的显卡直接分配技术,解决了KVM基于直接地址映射技术的显卡设备直接分配难题。在KVM中实现显卡直接分配,需要解决好显卡在虚拟机总线中的注册、PCI配置空间虚拟、显卡资源(显存及I/O地址)映射、VGABIOS调用、DMA映射等一系列问题。
5.1显卡在KVM虚拟机中的注册
KVM使用QEMU用户态进程虚拟外设,显卡如果在虚拟机中使用必须首先在QEMU中注册为一个称为pci-assign的特殊qdev虚拟设备。pci-assign虚拟设备是QEMU中专门为PCI透传定义的虚拟设备类型,每一个被透传到虚拟机中的PCI设备都会被注册为一个pci-assign虚拟设备,客户机操作系统对该虚拟设备进行的MMIO访问等操作都被直接转发到对应的真实物理设备上。该功能的实现已经在QEMU-KVM源代码中包含,只需要在启动KVM时通过命令行指定要映射的PCI设备BDF号(总线号、设备号、功能号)即可实现将该设备注册到虚拟机中。
但是作为显卡设备,仅注册为pci-assign虚拟设备并不能完全将显卡启用,虚拟机中能够从PCI资源中看到该显卡,但是显卡依然无法工作,还需要进一步完成后续的工作。
5.2 显卡专用总线的注册
因为性能需要,X86架构下大部分平台都将物理显卡挂接在独立的一根PCI总线(总线1或总线2)上,有些厂商的显卡驱动会对显卡BDF号进行检测,如果显卡在物理主机上的BDF号与虚拟机中注册的BDF号不一致,将无法正确驱动显卡(笔者实验用的NVIDIA Geforce G205M显卡就存在这个问题)。因此,为确保显卡直接分配技术在各类显卡中能够通用,需要在注册显卡到虚拟机中时确保显卡在虚拟机中的BDF号与真实机器的BDF号保持一致。
QEMU中缺省只虚拟了一条PCI总线(总线0),虚拟的磁盘控制器、CD-ROM驱动器、网卡、显卡、声卡等设备都注册在这条总线上。为满足显卡直接分配的需要,要修改QEMU源码多注册2条PCI总线。利用QEMU中已实现的虚拟PCI桥设备,在虚拟机系统总线初始化时注册2个QEMUDEC21154虚拟PCI桥设备,创建了总线1和总线2。然后修改QEMU注册PCI设备的实现方式,指定将透传显卡设备按照其真实主机上BDF相同的总线号、设备号、功能号进行一一对应的注册。这样就实现了显卡在虚拟机中与在真实主机上具有相同的BDF,以使得显卡驱动能够直接驱动显卡。
5.3显卡资源直接映射
自第1台IBMPC问世以后,显卡经历了MDA、MonoHercults、CGA、EGA、VGA、XGA、SVGA等标准,总线也由ISA、EISA、VESA、PCI、AGP直到现在的PCIE,前后共约30年的进程。虽然很多硬件都渐渐湮没在历史的洪流中,但是由于兼容性需要,一些内存或I/O端口还是作为历史遗留资源在X86硬件体系中保留了下来。
在Intel制定PCI总线标准时,在PCI空间保留了从0开始连续1MB的Memory空间,和从0开始连续64KB的I/O空间,其中给显卡预留的空间如表1所示。
表1 PCI显卡历史遗留资源
在PC机启动时,BIOS程序会扫描整个PCI空间,发现有PCI显卡时,会使能它的Mem访问和I/O访问,同时配置它的内存空间和I/O空间。但是上文提到的那2块保留的内存空间和I/O空间是不需要作专门配置的,PCI显卡可以直接响应落在这2段空间上的PCI访问请求。
进行显卡透传时必须将物理主机特殊的预留内存和I/O地址空间直接映射到虚拟机对应的地址空间中,以保证显卡初始显示。对于0xA0000~0xBFFFF内存空间向虚拟机的映射,借助Linux下特有的/dev/mem设备实现,通过/dev/mem设备可以访问到整个PC的全部物理内存。修改QEMU源代码,在分配了虚拟机的内存后(得到一个应用层地址空间的虚地址),直接打开/dev/mem设备,将地址0xA0000到0xBFFFF内存使用mmap方式直接映射到QEMU虚拟机的内存空间对应偏移地址处。
对于I/O端口0x3B0~0x3DF的映射,可直接向QEMU中注册I/O读写函数,该函数从应用层空间上转发对应的读写操作到真实主机的I/O端口上。
除历史遗留资源外,各种显卡还有其特有的内存和I/O资源,需要将这些资源都映射进虚拟机中。
Linux下的SYSFS系统提供了一种从应用层访问内核资源的简单途径。所有的PCI设备资源在系统初始化时都自动映射成/sys/bus/pci目录下的文件,应用层如果访问这些资源可直接打开文件将其mmap到内存中,对映射内存的读写操作都会传送到PCI设备的内存空间中。在注册物理显卡到虚拟机时,需要将对应的显卡资源也映射到虚拟机的地址空间中去。
5.4 显卡的PCI配置空间
在实现显卡直接分配时,最重要的是显卡的PCI配置空间虚拟化。PCI配置空间是用来动态配置PCI设备资源占用的一组寄存器,每个PCI设备都有自己独立的配置空间,在系统初始化时,由BIOS(也可在操作系统中配置)根据一定的算法分配PCI设备所占有的资源,并将资源信息写入PCI设备配置空间。
PCI总线规范定义的配置空间总长度为256Byte,配置信息按一定的顺序和大小依次存放。前64Byte的配置空间称为配置头,对于所有的设备都一样。配置头的主要功能是用来识别设备、定义主机访问PCI卡的方式(I/O访问或者存储器访问,还有中断信息)。其余的192Byte称为本地配置空间,主要定义卡上中断、I/O端口资源、内存基地址及范围等信息。PCI配置空间中基地址寄存器(Base Address Registers,BAR)就是用于配置PCI设备在系统中占用的I/O及内存地址及范围的寄存器。
对于普通PCI设备,可以直接虚拟PCI配置空间,由KVM虚拟机的BIOS在启动时重新配置该空间中的BAR和中断号等信息。但有些厂商的显卡则必须实现虚拟机里基地址寄存器值等于物理设备上基地址寄存器的值(VBAR=PBAR),原厂驱动才能够正确驱动显卡。因此,为保证显卡透传功能的通用性,针对显卡都采用VBAR=PBAR的映射方式。这需要为显卡透传专门修改虚拟机BIOS,使得其在开机初始化时针对显卡保留其与PBAR一致的虚拟机I/O及内存资源。
针对显卡的透传修改QEMU代码,在注册pci-assign虚拟设备时将设备真实PCI配置空间内容完整复制到虚拟配置空间。然后修改SeaBIOS(KVM虚拟机使用的BIOS)中PCI设备探测与资源分配部分的代码,在虚拟机SeaBIOS设置显卡各配置寄存器时,首先读取虚拟配置空间中的真实设备配置信息,优先为显卡分配虚拟机硬件资源,确保被透传的显卡与真实显卡保持一致的基地址寄存器配置信息。对于显卡中断等配置则可以根据需要由虚拟机进行映射转换,中断号的虚拟不影响显卡透传。
5.5 VGA BIOS系统
显卡也具有与主板上一样的基本输入输出系统(BIOS),称为VGABIOS。当系统加电启动时,主板BIOS会寻找到显卡,复制显卡中的VGABIOS到系统预留VGA BIOS专用内存空间中(地址0xC0000~0xCFFFF),并调用VGA BIOS初始化显卡。
每种显卡都有自己专用的VGA BIOS,存储在显卡ROM存储区或主板BIOS中。如果需要在虚拟机中初始化显卡,则必须在虚拟机BIOS中重新调用VGA BIOS。因此,需要提取VGA BIOS文件给虚拟机,由虚拟机启动时将该VGABIOS代码复制到VGA BIOS专用内存空间中执行显卡的初始化。
显卡VGA BIOS的提取有很多种方式,具体如何提取需要视主板或显卡情况而定。大部分显卡的VGA BIOS可以用工具从内存中提取(如AFLASH、GPU-Z等)。但有些显卡,如NVIDIA显卡,在VGA BIOS执行时会自动修改自己在内存中的部分代码,直接提取到的VGA BIOS无法用来初始化显卡。笔记本电脑集成的显卡通常都会将显卡BIOS集成到主板BIOS中,可以通过提取主板BIOS,分析出显卡BIOS存储位置,提取对应的VGA BIOS。
5.6 DMA映射
显卡的DMA映射问题,采用直接地址映射技术解决,通过修改Linux操作系统内核,预留从0x0x100000(1MB)地址开始的物理内存空间,直接映射给客户机操作系统使用,解决了客户机操作系统下直接对显卡DMA的处理。
6 结束语
虚拟机显卡透传技术解决了虚拟客户机操作系统图形显示效果差的难题。在终端安全领域,显卡透传技术通过客户机操作系统直接驱动物理显卡获得高质量显示效果,使得虚拟机中的客户操作系统具有更普遍的适应性,能够满足普通用户的使用需求,为基于全系统虚拟化技术的操作系统安全增强、进程控制、病毒防护等技术的研究成果更进一步地拓展了实用空间。
由于时间和能力所限,本文研究成果主要适用于当前主流的独立显存的显卡,对于一些特殊显卡或共享显存的集成显卡还会有些特殊处理,这里不再详述。通过在华硕K40IP笔记本电脑(支持VT-x,不支持VT-d)上验证,主机向客户机操作系统直接分配NVIDIA G205M显卡,并安装原厂驱动进行测试,测试证明虚拟机操作系统的显示效果得到质的提升,获得了和主机显示完全接近的效果。
核心关注:拓步ERP系统平台是覆盖了众多的业务领域、行业应用,蕴涵了丰富的ERP管理思想,集成了ERP软件业务管理理念,功能涉及供应链、成本、制造、CRM、HR等众多业务领域的管理,全面涵盖了企业关注ERP管理系统的核心领域,是众多中小企业信息化建设首选的ERP管理软件信赖品牌。
转载请注明出处:拓步ERP资讯网http://www.toberp.com/
本文标题:基于虚拟化的系统安全增强及显卡透传研究