-- linux爱好者,业余时间热衷于分析linux内核源码 -- 目前主要研究云计算和虚拟化相关的技术,主要包括libvirt/qemu,openstack,opennebula架构和源码分析。 -- 第五届云计算大会演讲嘉宾 微博:@Marshal-Liu
分类: 虚拟化
2011-09-18 21:55:16
1 qemu概述
qemu是一种快速的多体系结构仿真器,通过动态翻译的技术达到了优异的仿真速度。目前,qemu支持两种操作模式:
对于全系统仿真模式,qemu目前可以支持的硬件列表如下:
对于用户态仿真模式,qemu支持的硬件列表如下:x86 (32 and 64 bit), PowerPC (32 and 64 bit), ARM, MIPS (32 bit only), Sparc (32 and 64 bit), Alpha, ColdFire(m68k), CRISv32 and MicroBlaze CPUs are supported.
1.1 qemu 的本质
众所周知,Bochs 是一款可移植的IA-32仿真器,它利用模拟的技术来仿真目标系统,具体来说,将是将目标系统的指令分解,然后模拟分解后的指令以达到同样的效果。这种方法将每一条目标指令分解成多条主机系统的指令,很明显会大大降低仿真的速度。
qemu则是采用动态翻译的技术,先将目标代码翻译成一系列等价的被称为“微操作”(micro-operations)的指令,然后再对这些指令进行拷贝,修改,连接,最后产生一块本地代码。这些微操作排列复杂,从简单的寄存器转换模拟到整数/浮点数学函数模拟再到load/store操作模拟,其中load/store操作的模拟需要目标操作系统分页机制的支持。
qemu对客户代码的翻译是按块进行的,并且翻译后的代码被缓存起来以便将来重用。在没有中断的情况下,翻译后的代码仅仅是被链接到一个全局的链表上,目的是保证整个控制流保持在目标代码中,当异步的中断产生时,中断处理函数就会遍历串连翻译后代码的全局链表来在主机上执行翻译后的代码,这就保证了控制流从目标代码跳转到qemu代码。简单概括下:指定某个中断来控制翻译代码的执行,即每当产生这个中断时才会去执行翻译后的代码,没有中断时仅仅只是个翻译过程而已。这样做的好处就是,代码是是按块翻译,按块执行的,不像Bochs翻译一条指令,马上就执行一条指令。
1.2 qemu能够模拟的硬件
Bochs和qemu从非常低的层次对硬件进行模拟,对于像总线和外围设备如显卡,网卡,磁盘控制器等都有相对应的软件的表示,但是二者仅对有限的硬件集合进行精确的模拟,比如对中断控制器,总线驱动,磁盘驱动,键盘,鼠标,显卡以及网卡的模拟。随着时间的推移,可模拟的硬件集合将会扩展到客户操作系统能够支持的尽可能多的设备。Qemu和Bochs都利用运行在模拟机中的BIOSes来初始化硬件的某些部分,这种设计思想使得对设备的仿真忠于原始的硬件。
除了模拟之外,设备驱动利用主机的功能来提供模拟和用户要求的功能,下面来看几个例子:
1.3 可移植性
qemu采用了模块化的设计思想,仿真器中与目标平台相关的部分被分离到它们自己的文件和目录中。对于核心部分,驱动部分和动态翻译器来说,所有目标平台都声明相同的接口,在整个qemu的111,000行代码中,目标平台相关的组件代码大约占了1/3,特别地,x86目标平台的大约不超过8000行。与Bochs不同的是,qemu对目标平台的描述非常的紧凑,因此,可以模拟大量的目标平台。
qemu要求公开有关编译执行的信息以便动态翻译器使用,幸运地是,这些信息中的绝大部分对于调试器,动态连接器和单独编译来说都是非常必要的。另外,qemu完全由C语言编写,在主机和目标平台环境之间创建了一个隔离层。值得一提的是动态翻译器使用了带GNU扩展的C编写,这种结构化的可移植性,再加上GCC对大量系统的支持,使得qemu在主机系统之间的可移植性大大增加。
本文仅仅简单介绍下了qemu的相关知识,下一篇文章将会深入分析qemu的实现原理。
希望对qemu/kvm或虚拟化技术的爱好者多多交流,我的邮箱:ustc.dylan@gmail.com。