首页> 中国专利> 一种基于虚拟机的驱动程序加固方法

一种基于虚拟机的驱动程序加固方法

摘要

本发明提供了一种基于虚拟机的驱动程序加固方法,将驱动程序分为真实驱动程序、虚拟驱动程序和守护驱动程序;所述真实驱动程序为驱动硬件设备工作的真实代码,其设置于特权操作系统中,且通过隔离机制与特权操作系统的内核进行隔离;所述虚拟驱动程序包含驱动硬件设备所需的参数调用的转发代码,其设置于非特权操作系统中,且通过数据通道与守护驱动程序交互;所述守护驱动程序作为虚拟驱动程序和真实驱动程序的沟通桥梁设置于特权操作系统中。

著录项

  • 公开/公告号CN101071387A

    专利类型发明专利

  • 公开/公告日2007-11-14

    原文格式PDF

  • 申请/专利号CN200610037600.0

  • 发明设计人 刘发贵;张亚军;吴庆波;

    申请日2006-09-08

  • 分类号G06F9/46(20060101);G06F9/455(20060101);

  • 代理机构广州粤高专利代理有限公司;

  • 代理人何淑珍

  • 地址 510640 广东省广州市天河区五山路381号

  • 入库时间 2023-12-17 19:20:12

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2012-11-14

    未缴年费专利权终止 IPC(主分类):G06F9/46 授权公告日:20100512 终止日期:20110908 申请日:20060908

    专利权的终止

  • 2010-05-12

    授权

    授权

  • 2008-01-09

    实质审查的生效

    实质审查的生效

  • 2007-11-14

    公开

    公开

说明书

技术领域

本发明涉及计算机操作系统的驱动加固技术,特别是涉及一种基于虚拟机技术的驱动加固方法。

技术背景

近年来商用操作系统逐渐应用于关键业务应用中,因此对于操作系统的高可用性要求也提高到了一个新的层次。虽然经过多年的发展,操作系统已经比较成熟和可靠,但仍然会造成大量的系统失效。研究表明驱动程序是造成这些失效的主要原因。斯坦福大学的一项报告指出,Linux的驱动程序要比其他操作系统的驱动程序造成的失效高3-7倍,而Windows 2000的驱动程序问题占造成系统崩溃原因的27%,远高于2%由内核所造成的系统崩溃。如何设计并实现对操作系统中的驱动程序进行加固,使驱动的故障不会影响到内核的正常运行,进而提高系统的可用性就显得非常重要。

从实现方式的角度来分,可将目前主流的驱动加固技术分为四类,硬件实现驱动隔离方法,降低驱动程序优先级方法,软件故障隔离方法,以及使用安全语言编写驱动等。

通过硬件实现驱动隔离方法提高操作系统可靠性主要是i386架构中的段环架构。此类结构的典型例子是Palladium。这些系统支持细粒度的保护,并具有对特权子进程进行构建和隔离的能力。通过添加新的特权子系统可以对操作系统进行真实驱动,这些子系统运行于新的域或段中。但是在这些架构中,恢复都没有得到重视。特别地,对于支持以细粒度方式共享数据的能力,如果一个处于共享状态的模块失效了,对其他正在共享相同资源的模块进行恢复非常困难。段架构不但性能低下,而且编写困难。

降低驱动特权级方法是让驱动程序运行在非内核态的优先级下,这样可以防止设备驱动运行特权指令,访问特权地址空间,由此破坏内核。但是,这样做会带来性能上的比较大的损失,因为每次调用驱动需要陷入内核,在返回时又要更改特权级。L4,Exokernel以及Mach等微内核系统采用了这用技术。

而采用软件故障隔离方法的典型为VINO系统,其通过软件隔离方法对驱动模块的目标代码进行封装,使它只能跳转到自己的代码段,并且只能对自己的数据段进行写操作。因此,驱动程序中所有的跳转目标地址都有相同的高位结构(段标识符),同样,驱动程序中产生的所有合法数据地址都有相同的段标识符。将代码段和数据段分离可以防止驱动修改自己的代码段。这种隔离方式开销较小,但是需要对现有驱动程序进行修改,这对于拥有大量驱动程序的商用操作系统来说困难非常大。

使用安全语言如Java和Modula-3可以有效防止设备驱动程序非控的访问内核内存。但是使用安全语言需要重写驱动,并且在向驱动中安全复制数据时会引入额外的开销。到目前为止,操作系统供应商也不希望用安全语言来实现系统代码。而且,安全语言方法使得利用现有的巨大的代码库变得不可能。

所以目前的驱动隔离是将驱动代码放在单独的逻辑故障域中,本质上是在驱动和系统其他部分之间提供虚拟内存保护。由于只能对内存进行保护,这只能解决部分问题,而对于调度和访问特权指令没有进行处理,而这些方面的故障很容易造成系统的崩溃。

发明内容

本发明的目的在于提供一种对系统性能影响很小的情况下实现对设备驱动程序的隔离和加固,满足关键业务应用对高可靠和高可用性的要求,解决现有驱动模型带来的不安全的驱动加固方法,特别是提供一种基于虚拟机技术的驱动加固方法,从而提高系统的可靠性和可用性。

为了实现上述发明目的,采用的技术方案如下:

一种基于虚拟机的驱动程序加固方法,将驱动程序分为真实驱动程序、虚拟驱动程序和守护驱动程序;

所述真实驱动程序为驱动硬件设备工作的真实代码,其设置于特权操作系统中,且通过隔离机制与特权操作系统的内核进行隔离;

所述虚拟驱动程序包含驱动硬件设备所需的参数调用的转发代码,其设置于非特权操作系统中,且通过数据通道与守护驱动程序交互;

所述守护驱动程序作为虚拟驱动程序和真实驱动程序的沟通桥梁设置于特权操作系统中。

所述特权操作系统为运行硬件设备真实驱动程序的操作系统,其可能被有故障的驱动所破坏,进而破坏整个虚拟机系统,因此需要对真实驱动进行隔离,通过驱动分离,将驱动程序分为虚拟驱动,守护驱动和真实驱动。这样做可以将客户操作系统和真实驱动分离,从而防止真实驱动破坏非特权操作系统,所述非特权操作系统为没有真实驱动,只运行虚拟驱动的操作系统,而运行真实驱动的特权操作系统则由于设置有隔离机制,避免了真实驱动对内核的损坏。

上述技术方案中,所述真实驱动程序与特权操作系统的内核的隔离机制采用页表保护机制。

所述页表保护机制为每一个真实驱动程序设置单独的隔离域,并赋予每个真实驱动程序具有读内核以及只对自身隔离域才有写的权限。由于真实驱动程序对内核只具有写权限,所以避免了发生故障的驱动程序对内核进行写入操作从而损害内核的情况。

所述每个真实驱动程序的隔离域设置有与内核页表同步的拷贝页表,保证了真实驱动程序具有读内核的权限。

所述虚拟驱动程序和守护驱动程序之间的数据通道为共享内存和异步通信机制。这种共享内存和异步通信机制将通信从数据传输中分离,可以进行消息绑定,能够提供更有效的设备访问。

真实驱动程序之间,以及真实驱动程序与特权操作系统内核之间的通信也可以采用类似共享内存和异步通信机制。

所述特权操作系统设置有与每一个虚拟驱动对应的一个守护驱动。

所述守护驱动对从虚拟驱动中传来的请求,以及它返回给虚拟驱动的响应数据进行检查。其首先检查所请求的设备是否是虚拟驱动程序所在的非特权操作系统所拥有的,再检查所请求的内存空间是否存有冲突。

在驱动程序出现故障时,通过虚拟驱动和驱动管理器的协作,进行资源的回收和驱动的恢复。驱动恢复在于如果虚拟驱动程序发现与之对应的守护驱动程序长时间没有响应,或守护驱动程序长时间没有取消共享内存页时被启动,所述驱动恢复具体通过驱动管理器重新初始化一个新的驱动实例,并加入到新的隔离域中,然后将新的真实驱动已经重启的信息通知虚拟驱动程序,并在虚拟驱动程序与守护驱动程序之间建立一个新的数据通道,重新发送请求数据。

本发明通过将驱动程序分为真实驱动程序、虚拟驱动程序和守护驱动程序,将客户通常使用的操作系统和真实驱动分离开,从根本上防止了驱动故障对系统可能造成的影响。并对真实驱动程序进行隔离和加固,在出现故障时进行及时有效的恢复,可以将整个系统维持在一个较高的可靠性级别上。与现有的驱动加固技术均是将驱动代码放在单独的逻辑故障域中,本质上是在驱动和系统其他部分之间提供虚拟内存保护相比较。本发明除了提供对驱动程序和系统其他部分之间的内存保护外,还提出一个逻辑隔离层来提供对调度和访问特权指令的隔离,进一步提高系统的可靠性和可用性,满足关键业务应用对高可靠和高可用性的要求。

附图说明

图1为本发明的架构示意图;

图2为虚拟驱动、守护驱动和真实驱动的关系图;

图3为共享内存数据传输流程图;

图4为本发明的数据传输方式示意图;

图5为真实驱动隔离架构图;

图6为守护驱动与真实驱动交互数据流图;

图7为驱动恢复流程图。

具体实施方式

下面结合附图对本发明做进一步的说明。

本发明的架构示意图如附图1所示,主要由虚拟驱动、守护驱动、真实驱动隔离域、虚拟驱动和守护驱动之间的数据通道、设备管理控制器以及虚拟机监视器VMM组成。

主要有如下特点:

利用VMM将驱动程序分为虚拟驱动和守护驱动两部分;

将客户操作系统的非特权操作系统与真实驱动分离开,然后将真实驱动运行在独立的隔离域中,从而防止由于真实驱动的异常造成特权操作系统和后端驱动的崩溃;

在守护驱动中加入对从虚拟驱动中传来数据进行验证的保护机制;

虚拟驱动和守护驱动之间,真实驱动与内核,真实驱动与守护驱动之间的通信采用共享内存和异步通信机制,可以提供快速有效的数据交互;

设备管理控制器在驱动出现故障时,与VMM共同进行资源的回收和恢复操作。

本发明利用VMM将非特权操作系统与真实驱动分离开,将非特权操作系统和真实驱动分别运行在不同的虚拟机中。在非特权操作系统中只运行虚拟驱动,而真实驱动和守护驱动则运行在特权操作系统中。这种将操作系统和驱动程序分离开的方法从根本上避免了驱动程序的故障造成系统的破坏。

附图2为虚拟驱动、守护驱动以及真实驱动之间的关系图,在非特权操作系统中,每类设备只需要一个虚拟驱动,如图中给出的是网卡虚拟驱动。这个虚拟驱动只进行驱动调用的参数转发,初始化与守护驱动的数据通道等工作,因此,虚拟驱动的代码会非常精简,每一个虚拟驱动代码只有一千行左右,大约相当于一个真实驱动的代码量。由于代码量的减少,也减少了虚拟驱动出现故障的可能。通过对虚拟驱动的代码进行严格的检查以及对实现功能的严格限定,可以认为虚拟驱动与操作系统内核一样,是可以信任的。

每一个虚拟驱动在特权操作系统中都有与之对应的一个守护驱动。守护驱动主要对从虚拟驱动中传来的调用信息进行验证和分类,并调用相应的真实驱动进行实际的设备操作,如具体的网卡驱动e1000、pcnet32、3c59x等,在设备操作完成后,再对返回的数据参数进行地校验,最后通过数据通道将这些信息返回给虚拟驱动。

附图3为共享内存数据传输的流程图。首先虚拟驱动调用非特权操作系统中的内存管理系统,申请一个内存页。然后通知VMM,说明此页可以被其它域所共享。接着通知守护驱动关于这个页的信息,守护驱动收到相关信息后,向VMM申请对这个页的映射,VMM对请求进行验证,如果请求合法,则修改这个页的映射,将这个页映射到守护驱动所在的域中。如果不合法,则进行出错处理。最后守护驱动通知相应的真实驱动,进行数据传输。

附图4为共享内存和异步通信相结合的数据传输方式示意图,这种方式主要用于虚拟驱动与守护驱动以及守护驱动与真实驱动隔离域之间的数据传输。由图中可以看到,数据传输方式使用两对生产者-消费者索引。虚拟驱动将服务讲求放在请求服务队列中,增加请求生产索引,然后使用类似于中断机制的异步通信通知守护驱动,接着守护驱动处理并消除这些请求,增加请求消费索引。返回时的情况与之相似,在守护驱动完成服务后,将响应结果放在请求响应队列中,增加请求生产索引,使用异步通信通知虚拟驱动,虚拟驱动处理这些响应,并增加请求消费索引。由于请求队列和响应队列是基于共享内存方式,这种将异步通信和共享内存结合的方式,可以对虚拟驱动和守护驱动之间的请求和响应方式进行优化,提高数据传输的性能。

附图5给出了在特权操作系统中真实驱动的隔离架构图。本发明使用页表保护机制将真实驱动程序运行在一个单独的隔离域中。每一个隔离域都有自己私有的数据结构,包括本地域堆,真实驱动使用的栈,内存映射的I/O区域,以及内核高速缓存。虽然驱动程序和内核都运行在内核地址空间中,但对于内核数据结构的访问有不同的权限,内核可以访问所有的数据结构,包括驱动隔离域中独有的堆、栈等,但驱动对于内核地址空间只具有读权限,对于域内的数据对象才具有写的权限。

为了提供真实驱动读内核的权限,本发明为每个域维持了一个和内核页表同步的内核页表的拷贝。

为了实现真实驱动的隔离,需要对操作系统内核作一些必要的修改。首先,在内核修改页表的地方插入更新真实驱动隔离域中页表内容的代码,以保证内核页表和真实驱动页表之间的同步。

由于真实驱动运行在一个与内核不同的隔离域中,为了发现发生在真实驱动隔离域中的异常,还需要对内核的异常程序进行修改。当真实驱动发生异常时,新增加的代码交换内核的堆栈指针和页目录指针,而在异常返回时,为扩展恢复栈指针和页表指针。最后,需要定位当前任务结构,将当前的保护域与任务结构联系在一起。

附图6为真实驱动与守护驱动或内核之间的交互过程。真实驱动想要调用内核函数时,会直接通过一个对内核函数进行封装的wrapper函数,这个wrapper函数相当于内核函数提供给真实驱动的一个stub,在wrapper中对驱动调用的参数,访问内存地址,指令类型等进行校验,如果没有问题,就将这个请求通过数据通道提交给内核。如果发现有问题,则通知VMM,由VMM调用驱动管理器进行一些处理。

在由数据通道提交给内核调用信息时,采用共享内存还是采用异步通信方式,根据调用的类型进行决定。如果是用于大量数据传输的调用,则采用共享内存方式,由wrapper请求一个内存页,然后通过VMM将这个内存页映射到内核的地址空间中,以后的随之来的数据通信都可以通过这个内存页进行。如果是进行事件通知,则采用异步通信方式。由wrapper将请求挂在请求服务队列中,由内核从队列中取下,并进行处理。

内核对请求调用处理完成后,数据的返回过程与调用时相似。

守护驱动对从虚拟驱动中传来的请求检查主要集中于两方面,首先检查请求的设备是否是这个非特权操作系统所拥有的,然后检查所请求的内存空间是否与VMM所在的空间有冲突。

在守护驱动中还可以加入一些策略,对驱动请求进行一些安全限制或者性能方面的优化。

附图7给出了驱动出现故障时,进行恢复的流程图。如果虚拟驱动发现守护长时间没有返回响应,或者VMM发现守护驱动长时间没有取消共享内存页,VMM会认为相应的真实驱动已经出现故障。VMM将这个事件通知驱动管理器,由驱动管理器重新初始化一个新的驱动实例,并加入到新的隔离域中。然后通知虚拟驱动,新的真实驱动已经重启。虚拟驱动与守护驱动之间建立一个新的数据通道,重新发送请求数据。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号