admin管理员组

文章数量:1567525

2024年1月9日发(作者:)

第27卷第9期 2010年9月 ‘计算机应用与软件 Computer Applications and Software V01.27 No.9 Sep.2010 VMM下Guest OS进程级管理工具设计与实现 张纪胜 陈香兰 周学海 (中国科学技术大学计算机科学与技术系 安徽合肥230027) 摘 要 目前在虚拟监控器VMM(Virtual Machine Monitor)下还没有能高效方便地对Guest OS进程进行管理的工具。以VMM是 Lguest,Guest OS是Linux为运行环境,实现了名为GPMU(Guest Processes Management Utilities)的VMM下Guest OS进程级的管理工 具原型。GPMU在不改动Guest OS和对VMM性能影响尽可能小这两个前提下,通过直接在VMM中动态地按需获得Guest OS中进 程描述符后对其操作来实现Guest OS进程级管理。实验结果表明GPMU的实现是正确有效的。还分析了GPMU的性能瓶颈并做 了对应的优化,典型的管理操作时间缩短为原始实现中的41%,大幅提高了性能。 关键词 VMM 虚拟机进程级管理工具Lguest DESIGNING AND IMPLEMENTING PRoCESS LEVEL GUEST oS MANAGEMENT UTILITIES oN VMM Zhang Jisheng Chen Xianglan Zhou Xuehai (Department ofComputer Science and Technology,University fScioence and Technology ofChina,Hefei 230027,Anhui,Chia)n Abstract Currently,there are no utilities to manage Guest OS process efficiently and conveniently on VMM.In this paper,we implement a prototype of process level Guest OS management utility,named as GPMU,in an operation environment taking Lguest as VMM and Linux as Guest OS.With two prerequisites,to ensure no modiifcation on the Guest OS and to minimise the performance degradation of VMM,the GPMU implements the process level Guest OS management via operating the process descriptors of Guest OS dynamically obtained from VMM directly and on demand.Our experiments demonstrate the correctness and effectiveness of the implementation of GPMU.We also analyse GPMU’S per- formance bottleneck and make some corresponding optimisations.As the result.the typical management operation time is reduced to 41%of the original implementation,the performance is improved dramatically. Keywords Virtual machine monitor(VMM) Virtual machine Process level management utilities Lguest 可能存在性能瓶颈的地方进行分析和优化。值得注意的是虽然 0 引 言 系统虚拟机技术通过在物理硬件上增添一层软件层虚拟出 一GPMU是针对lguest实现的,但其实现方法是通用的,可以方便 地移植到其它VMM下。 个或多个计算平台,这层软件层被称为虚拟监控器VMM , 1 实现途径 1.1客户端服务器模式 最简单的方法是在VMM中运行一个管理程序而在Guest 有的时候也称为hypervisor,如此虚拟出的系统被称为虚拟机, 有时该虚拟机也被称为Guest。虚拟机都在VMM的监控和辅 助下访问底层物理硬件。因为VMM能允许多个虚拟机透明地 复用物理机器的资源同时又能对虚拟机进行严格地监控,所以 近年来虚拟技术在企业计算、云计算、灾难恢复以及系统安全领 域得到了广泛的应用。 虽然VMM能够有效地管理虚拟机,但其管理粒度是虚拟 机级的,很多情形下需要能够对虚拟机中操作系统的进程进行 OS里运行一个控制服务器具体实现管理工作。VMM中的管理 程序通过套接字、共享内存等通信手段与控制服务器通信,由 VMM中的管理程序发出命令指示控制服务器实现某种管理功 能并把结果传回。这种方法的好处是简单易行,能够复用操作 系统现有的管理工具。其不足在于:(1)需要Guest OS运行额 管理,也就是说管理粒度需要达到进程级别,比如列出当前虚拟 机操作系统中的所有进程、收集它们的负载信息、杀死其中某个 进程等等,更有甚者有时需要得到虚拟机操作系统中进程的内 核执行路径。 外控制服务程序;(2)如果Guest OS发生问题或者额外的控制 服务进程意外终止,此方案实现的管理工具就会失效;(3)此管 理工具应用于基于VMM的安全解决方案时,Guest OS通常被 认为是不可信的,其返回的信息可能被攻击者恶意修改。 目前还没有成熟的安全高效且使用方便的虚拟机进程级管 理工具。本文先分析了两种可能的实现方法并对它们的优劣进 行分析,而后以VMM是lguest,Guest OS是Linux为例提出一种 1-2 VMM直接操作Guest OS进程描述符模式 操作系统中进程描述符保存了进程的所有相关信息和控制 收稿El期:2009—04—14。张纪胜,硕士生,主研领域:操作系统: 不需改动Guest OS且具有较高性能的GPMU实现技术,并对其 

l64 计算机应用与软件 消除额外的一次地址映射。 ‘ 2010血 结构,如果能够在VMM中获取Guest OS中的进程描述符,那么 对Guest OS中进程的管理就能通过直接在VMM下操作该进程 描述符进行。其优点是显而易见的,它克服了1.1节方案中的 诸多缺点。这种方案的难点在于正确完整地获取Guest OS中 的所有进程描述符的同时对VMM的性能影响要尽可能小。 文献[2]中以VMM是KVM,Guest OS是Linux为例提出了 一Lguest用影子页表来维护guest虚拟地址到host物理地址 的映射关系,Lguest以客户机页表为蓝本建立起影子页表,并且 会随着客户机页表的更新而更新。客户机实际上是通过影子页 表在访问真实的机器物理地址。 为方便影子页表的实现,Lguest中实现了guest—pa函数用 种直接在VMM中获取Guest OS的进程描述符的方法。它主 于转换guest虚拟地址为对应的guest物理地址。此外还实现了 Lgread函数用于读取guest中某物理地址所在处的值。结合这 两个函数我们就能在VMM里直接读取guest中虚拟地址所指 内存的内容。 要通过截获VMM中写页目录寄存器(在X86上即CR3寄存 器)的操作,从而在每次Guest OS进程切换时获取Guest OS中 进程的页目录地址,将此地址和对应的Guest OS进程描述符地 址保存在内存缓冲区中,当需要时以Guest OS进程的页目录地 址为关键字在内存缓冲区中查找。这种方法的不足在于:(1) 以页目录地址为关键字并不能标识所有进程,因为Linux系统 中并非所有进程都有独立的页目录地址。例如内核线程 (kernel thread)和以CLONE—VM标志调用clone函数生成的轻 量级进程是没有自己独立的页目录地址的。(2)每当Guest OS 2.3所有进程描述符的获取 Linux内核中的进程描述符是类型为task—struct的结构体, 所有进程相关的信息都保存在这个结构体中。从Linux2.6内 核开始引入thread—info结构体用来保存访问最频繁的原来位于 task—struct结构体中的内容,task—struct结构体不再位于内核堆 栈的顶端。Linux内核为每个进程分配(THREAD—ORDER+1) 进程切换时都需要以Guest OS进程页目录地址为关键字在缓 冲区中查找是否在缓冲区中已经有记录,Guest OS进程切换时 间大幅增加严重影响VMM性能。(3)进程消亡时需要在缓冲 区中查找该进程对应的记录并删除,这不仅再一次降低VMM 性能,更为严重的是VMM很难得知Guest OS中哪一个进程消 个页面用来存放thread~info结构体和内核态进程堆栈。 THREAD—ORDER在内核编译配置时根据是否使用独立的中断 堆栈确定为零或为一。 如图1所示,thread—info结构体和内核态堆栈存在于一个 有(THREAD—ORDER+1)个页面的内存区域上,thread—info结 构体位于内存区域的前端,内核态堆栈从内存区域的末尾往下 增长 J。taskstmct结构体中有一个stack指针指向对应的 —亡、何时消亡。进程消亡时从缓冲区中删除记录的操作在文献 [2]中被忽略了。综上所述文献[2]中的方法并不能完整获得 Guest OS中所有进程描述符,并且对VMM性能影响极大。 GPMU是通过在VMM直接操作进程描述符来实现的,同时 为保证正确完整性,以进程描述符来唯一标识一个进程;为减少 对VMM性能的影响,我们结合Linux系统中进程描述符的特点 从VMM动态按需获得Guest OS所有进程描述符。 thread—info,同时thread—info结构体中也有个task指向对应的 r-蕊 一l’ tasksteeto r—2基于Lguest实现GPMU 2.1 Lguest简介 Lguest_jl 是由IBM工程师Rusty Russell开发的一种半虚 图1 task—steet、trhread—info和内核堆栈关系示意图 X86平台下ESP寄存器是CPU堆栈指针寄存器,用来指示 当前栈顶位置。执行这样一条c语言语句后P=esp& (THREAD—SIZE一1),P将指向进程的thread—info结构体,于是 P一>task将会指向进程的task—struct结构体。事实上在GPMU 拟化解决方案,从2.6.23开始集成进Linux内核。它由一个名 为1g的Linux内核可加载模块和一个应用层的名为Launcher应 用程序组成。lg主要负责CPU、内存、中断等的虚拟以及host与 guest的切换。lg内核模块加载时分配一块内存并映射到vmal— loc区域之上的一段目前没用到的地址空间中,然后加载一段短 实现过程中,我们正是通过下面基于同样原理的内联函数来得 到进程的进程描述符的:第二条语句执行完之后P的值是Guest 0S中进程的thread—info结构体地址,但此地址是guest中的虚 小精悍的switcher代码到这段地址空间中。switcher的主要功 能是负责在host和guest之间切换,比如页目录、通用寄存器的 切换等等。同时lg还导出了/dev/lguest设备文件接口给应用 层的Launcher使用。应用层的Launcher启动时映射了一块内 存作为虚拟机的物理内存,然后通过/dev/luesgt设备文件接口 和Ig内核模块交互从而虚拟出一个guest环境。 拟地址,我们不能直接用P一>task来得到其task成员的值,需 要调用guest—pa函数将guest虚拟地址转换为guest物理地址, 最后调用lgread读出进程描述符地址。 static inline struct task—steetr g current(street lg_cpu cpu)  {struct taskstruct —2.2影子页表 Guest有自己的页表用来将Guest的虚拟地址映射到Guest 的物理地址,但Guest的物理地址通常并不是host中的物理地 P: P=一(THREAD—SIZE一1)&cpu一>regs一>esp; P=guest—pa(cpu,P一>task); P lgread(cpu,P,unsigned long); 址,所以要访问真实的的物理内存还需要一个把经Guest OS页 表转换得到的guest的物理地址转换为host中物理地址的机制。 这样访问内存需要经过guest虚拟地址到guest物理地址再到 return P; task_struct结构体有一个类型为struct list—head名为tasks host物理地址两次映射,这极大影响了VMM的性能。现在大多 数VMM包括lguest在内都使用一种被称为影子页表的技术来 的成员,Linux内核通过这个成员将系统中的所有进程的进程描 述符链接在一起。只要依次遍历此链表即可获得系统中所有进 

第9期 张纪胜等:VMM下Guest OS进程级管理工具设计与实现 (2)消除重复获取进程描述符表地址的操作 l65 程的进程描述符,但同样要注意访问指针时将guest虚拟地址转 换为guest物理地址。 整个流程的算法的C伪码如下: inittask=task=P=g在原始实现中,每次动态获取所有进程描述符时,都先要通 过保存的ESP寄存器值获得Guest OS某一个进程描述符地址, 其实这不是必需的。我们第一次动态获取Guest OS中所有进 程描述符后可以找到0号进程也即swapper进程的描述符,此进 current(epu); do{ 对task所表示的进程进行各种进程粒度的管理操作; P=&task一>tasks: 程是Linux系统中的第一个进程而且在系统运行期间永不消 亡。一旦得到该进程描述符地址后完全可以保存以便后面使 用,代价就是多用了一个4字节的静态变量存储它,换来的收益 是消除了后面动态获取过程中每次都要重新获取进程描述符地 址的操作,这包括一次guest—pa函数调用、一次lgread函数调 用。这是典型的以空间换时间的优化方法。 (3)优化效果 //读出类型为struet list—head的tasks成员的值 l=lgread(cpu,guest—pa(cpu,P),stmct fist—head); //将链表的下一个指针赋给P P=1.next; //读出P的值 P lgread(epu,guest..pa(cpu,P),struct 1is{一head ); //得到P所在链表的task—struct结构体指针 task=hstentry(P,struct task—struet,tasks); —为测试优化效果我们以获得Guest OS中所有进程的进程 名这样一个应用为例,在同一台PC机上分别测试了对于同样 }while(inittask!=task) 的Guest OS实例的原始实现,经步骤(1)优化和再经步骤(2)优 化后的动态获取所有进程描述符的所用时间。 3效果与性能分析 3.1正确性验证 我们构建了GPMU的原型,该原型中的VMM为Linux ker.. nel 2.6.29中的lguest,Guest OS是运行同一个版本内核的Debi— 表1原始实现、经(1)优化以及再经 (2)优化后获取所有进程描述符时间 原始 (1)优化后 (1)+(2)优化后 时间(单位时钟周期) 19388 8194 8095 an Linux系统。实验的硬件平台是一个Pentium4 1.60GHz CPU、256M RAM的PC机。在GPMU中实现了获得所有进程列 表、查看特定进程负载等几个管理命令。正确性是通过比较 从表1可以看出经步骤(1)优化后,获得Guest OS中所有 进程描述符的时间从原始实现的19388个时钟周期减小为8194 个时钟周期,为原始实现的42%,有超过一倍的性能提升。在 此基础上再经步骤(2)优化后,获得Guest OS所有进程的进程 GPMU中命令的返回结果和Guest OS中对应功能的管理命令的 返回结果来验证的。实验结果表明实现方案是正确有效的。 描述符时间从8194个时钟周期再减少为8095个时钟周期(大 概5.059个微秒),为原始实现的41%,在步骤(1)的基础上再 次减少了1%的时间花费。 3.2性能测量方法 我们的方法是在需要时才去获取Guest OS所有进程描述 符,然后对进程描述符做相应操作从而实现进程级的管理,唯一 的瓶颈在动态获取所有进程描述符的操作上。为精确测量获得 所有进程描述符这一操作的时间,我们利用了自Pentium处理 器以来就有的rdtsc指令读取处理器的时间印戳计数器 J,该计 4 结论 本文在不改动Guest OS和尽可能不影响VMM性能的前提 下,以VMM是luest,Guestg OS是Linux为例设计并实现了 数器每个时钟周期加1。为方便使用我们实现了如下的宏,调 用rdtse(1ow)即能将处理器当前时间印戳计数器值读入变量 low(为unsigned long型)中。 #define rdtsc(1ow)\…asm一…volatile一(”rdtse' :”=a”(1ow): : edx”) Guest OS进程级的管理工具GPMU。本文接着分析了可能存在 的性能瓶颈并做了对应的有效的优化。结果表明本文的方案是 正确有效的,并且不需要改动Guest OS,对VMM性能的影响是 微乎其微的。目前GPMU中实现的管理命令比较少,增添更多 的GPMU管理命令是下一步的工作。 在获取Guest OS所有进程的进程描述符前调用一次,获取 Guest OS所有进程的进程描述符后再调用一次,两次得到的计 数器的差值即为所用时间,其单位为测试机器的时钟周期。 参考文献 3.3性能瓶颈和优化 (1)优化task—struct结构体的地址转换过程 [1]James E Smith,Ravi Nair.虚拟机一系统与进程的通用平台[M].北 京:电子工业出版社,2006. 我们每次获得进程描述符时,都需要调用guest一33a函数把 Guest OS中的虚拟地址转换为Guest OS中的物理地址,然后通 过lgread读取该地址处值。其中guest—pa函数是通过查询 Guest OS页目录表得到要转换的虚拟地址所对应的页表地址, [2]康华.从VMM中识别GUEST OS中的用户进程[EB/OL].http:// blog.csdn.net/kanghua/arehive/2007/lO/1 1/1820785.aspx. [3]Corbet.An introduction to lgue ̄t[EB/OL].http://1wn.net/ Articles/218766/. 进而再查询此页表得到Guest OS中物理地址的,这一过程是非 常耗费时间的。我们知道Linux内核中进程描述符task—struct [4]Rusty Russel1.Doeument/lguest,drivers/lguest under Linux kernel soul ̄e. [5]Daniel P,Bovet,Marco Cesati.Understanding the Linux Kernel[M].0 REILLY,2006. 分配在内核的直接映射物理内存的逻辑地址空间中,其虚拟地 址到物理地址映射关系是非常简单的,通常只相差一个常量偏 移。在这种情形下,可以用简单地减去一个常量偏移操作来替 代guest—pa函数调用。由此带来的性能提升是惊人的。 [6]Intel Corporation.Intel 64 and IA一32 Architectures Software Develop-- er s Manual[EB/OL].http://www.inte1.corn/products/processor/ mallI】als/. 

本文标签: 进程描述符实现地址管理