首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

使用 QEMU 进行系统仿真

使用 QEMU 进行系统仿真

QEMU 是什么?
目前,简单地将虚拟化称为一种热点技术似乎有些保守。 在 google 搜索 virtualization 一词可得到大约 2200 万条记录。例如,在短短的一个月内,EMC 公司宣布为 VMware 首次公开募股,Citrix Systems 宣布购买 XenSource 的计划,而新起的虚拟化创业公司随处涌现。在虚拟化产品的巨大市场上,不断出现各种新兴的小型市场。但是时下在热议有关虚拟化的首次公开募股和收购时,容易忽略一些其他的现有虚拟化技术。
本文所介绍的一种有趣的虚拟化应用程序 QEMU 并非目前的热门技术。QEMU 应用程序适用于各种设置。可用于来宾操作系统的虚拟化,或作为完整的机器仿真器使用,运行使用主机 CPU 或其他 CPU 架构的操作系统。
回页首
虚拟化简介
我们首先简要介绍一下虚拟化,阐述 QEMU 的搭建背景。
本文中介绍的虚拟化实际上指的是平台虚拟化。在物理硬件上,控制程序可能是主机操作系统或管理程序(见图 1)。在某些情况下,主机操作系统就是管理程序。来宾操作系统位于管理程序中。在某些情况下,来宾操作系统与控制程序使用相同的 CPU,而在另外一些情况下,则可能不同(比如 PowerPC 来宾操作系统在 x86 硬件上运行)。
图 1. 平台虚拟化的基本架构
图 1. 平台虚拟化的基本架构
您可以通过多种方法实现虚拟化,但是最常见的有三种。第一种称为本地虚拟化(或全虚拟化)。在这种虚拟化中,管理程序实现基本的隔离元素,将物理硬件与来宾操作系统相分离。这种技术首次出现于 1966 年 IBM® CP-40 虚拟机/虚拟内存操作系统中,另外 VMware ESX Server 也使用了此技术。
另一种流行的虚拟化技术称为半虚拟化。在半虚拟化中,控制程序实现了管理程序的应用程序接口(API),它将由来宾操作系统使用。Xen 和 Linux Kernel-based Virtual Machine (KVM) 都使用了半虚拟化技术。
第三种有用的技术称为仿真。仿真,顾名思义,通过模拟完整的硬件环境来虚拟化来宾平台。仿真可通过多种方法实现,即使在同一个解决方案中也是如此。通过仿真实现虚拟化的技术有 QEMU 和 Bochs。
回页首
QEMU 架构
我们首先了解一下 QEMU 如何实现仿真。本节将介绍 QEMU 的两种操作模式,以及 QEMU 动态翻译程序的一些有趣特点。
QEMU 基本操作
QEMU 支持两种操作模式:用户模式仿真和系统模式仿真。用户模式仿真 允许一个 CPU 构建的进程在另一个 CPU 上执行(执行主机 CPU 指令的动态翻译并相应地转换 Linux 系统调用)。系统模式仿真 允许对整个系统进行仿真,包括处理器和配套的外围设备。
在 x86 主机系统上仿真 x86 代码时,使用 QEMU 加速器 可以实现近似本地的性能。这让我们能够直接在主机 CPU 上执行仿真代码(在 Linux 上通过 kernel 模块执行)。
但是从技术角度看,QEMU 的有趣之处在于其快速、可移植的动态翻译程序。动态翻译程序 允许在运行时将用于目标(来宾)CPU 的指令转换为用于主机 CPU,从而实现仿真。这可以通过一种强制方法实现(将指令从一个 CPU 映射到另一个 CPU),但是情况并非总是这样简单,在某些情况下,根据所翻译的架构,可能需要使用多个指令或行为更改。
QEMU 实现动态翻译的方法是,首先将目标指令转换为微操作。这些微操作是一些编译成对象的 C 代码。然后构建核心翻译程序。它将目标指令映射到微操作以进行动态翻译。这不仅可产生高效率,而且还可以移植。
QEMU 的动态翻译程序还缓存了翻译后的代码块,使翻译程序的内存开销最小化。当初次使用目标代码块时,翻译该块并将其存储为翻译后的代码块。 QEMU 将最近使用的翻译后的代码块缓存在一个 16 MB 的块中。 QEMU 甚至可以通过在缓存中将翻译后的代码块变为无效来支持代码的自我修改。
要了解 QEMU 及其动态翻译程序的更多内部细节,请参阅 参考资料 一节中 Fabrice Bellard(QEMU 的作者)所撰写的有趣文章。
受支持的外围设备
将 QEMU 作为 PC 系统仿真器使用可提供各种外围设备。需要的标准外围设备包括硬件 Video Graphics Array (VGA) 仿真器、PS/2 鼠标和键盘、电子集成驱动器(Integrated Drive Electronics)硬盘和 CD-ROM 接口,以及软盘仿真。另外,QEMU 包括对 NE2000 Peripheral Controller Interconnect (PCI) 网络适配器、串行端口、大量的声卡和 PCI Universal Host Controller Interface (UHCI) Universal Serial Bus (USB) 控制器(带虚拟 USB 集线器)的仿真。Processor symmetric multiprocessing (SMP) 支持也得到了对 255 个 CPU 的支持。
除了仿真标准 PC 或 ISA PC(不带 PCI 总线)外,QEMU 还可以仿真其他非 PC 硬件,如 ARM Versatile 基线板(使用 926E)和 Malta million instructions per second (MIPS) 板。对于各种其他平台,包括 Power Macintosh G3 (Blue & White) 和 Sun-4u 平台,都能正常工作。
回页首
构建和安装 QEMU
构建和安装 QEMU 与使用标准的 GNU 工具一样简单。下载并打开 QEMU 发行版之后,configure、make,然后 make install,任务就完成了(见清单 1)。
清单 1. 构建 QEMU 仿真器
点击查看代码清单
此过程不仅可以为当前的目标架构创建可执行的 qemu 映像,而且可以为其他架构(包括 ARM、MIPS、PowerPC、68k 和 SPARC)创建一组映像。 这样,您就可以引导为不同目标架构构建的 Linux 内核。
如果主机操作系统和来宾操作系统运行于相同的处理器架构之上,那么您可以使用 QEMU 加速器(KQEMU)实现近似本地的性能。KQEMU 是一个驱动程序(Linux 的内核模块),允许用户模式的代码和内核代码直接在主机 CPU 上执行。构建 QEMU 加速器与构建 QEMU 本身相同(见清单 2)。
清单 2. 构建 QEMU 加速器
点击查看代码清单
您可以在很多操作系统,包括 Microsoft® Windows®、FreeBSD® 和 Linux 上编译和安装 KQEMU。构建 QEMU 加速器之后,使用以下命令在 Linux 中安装该加速器:
$ insmod kqemu.ko $
继承事业,薪火相传
返回列表