QEMU源码剖析(一)

QEMU源码剖析(一)

1 qemu概述

    qemu是一种快速的多体系结构仿真器,通过动态翻译的技术达到了优异的仿真速度。目前,qemu支持两种操作模式:

  • 全系统仿真模式。在这种模式下,qemu完整的仿真目标平台,此时,qemu就相当于一台完整的pc机,例如包括一个或多个处理器以及各种外围设备。这种模式可以用来运行不同的操作系统或调试操作系统的代码。
  • 用户态仿真模式。在这种模式下,qemu能够运行不同于主机平台的其他平台的程序(比如,在x86平台上运行为arm平台编译的程序),其中典型的代表wine windows API emulator。另外,在这种模式下能够进行方便的交叉编译和调试。

    对于全系统仿真模式,qemu目前可以支持的硬件列表如下:

  • x86 or x86_64 体系结构处理器
  • ISA PC (没有PCI总线的PC)
  • PowerPC 处理器
  • 32/64bit的SPARC 处理器
  • 32/64bit的MIPS处理器
  • ARM体系结构的处理器
  • PXA 270、PXA 255
  • OMAP 310、OMAP 2420、OMAP 310

    对于用户态仿真模式,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来初始化硬件的某些部分,这种设计思想使得对设备的仿真忠于原始的硬件。

    除了模拟之外,设备驱动利用主机的功能来提供模拟和用户要求的功能,下面来看几个例子:

  • 帧缓冲区通过用户可选择的接口被暴露出来,对于qemu来说,帧缓冲有SDL window,VNC Server和无图形界面的输出三个可供选择的选项
  • qemu中的网络可以是被禁止的,可以是被桥接到主机的,可以使用虚拟以太网协议创建的Unix套接字,还可以是被在qemu中被完全模拟的

1.3 可移植性

    qemu采用了模块化的设计思想,仿真器中与目标平台相关的部分被分离到它们自己的文件和目录中。对于核心部分,驱动部分和动态翻译器来说,所有目标平台都声明相同的接口,在整个qemu的111,000行代码中,目标平台相关的组件代码大约占了1/3,特别地,x86目标平台的大约不超过8000行。与Bochs不同的是,qemu对目标平台的描述非常的紧凑,因此,可以模拟大量的目标平台。

    qemu要求公开有关编译执行的信息以便动态翻译器使用,幸运地是,这些信息中的绝大部分对于调试器,动态连接器和单独编译来说都是非常必要的。另外,qemu完全由C语言编写,在主机和目标平台环境之间创建了一个隔离层。值得一提的是动态翻译器使用了带GNU扩展的C编写,这种结构化的可移植性,再加上GCC对大量系统的支持,使得qemu在主机系统之间的可移植性大大增加。


参考来源:http://blog.csdn.net/ustc_dylan/article/details/6784876

你可能感兴趣的:(QEMU源码剖析(一))