内容


使用 Bochs 进行平台仿真

Comments

Bochs 是较小的 GNU 公共许可证(GNU Public License,GPL)下获得许可的一种 x86 PC 仿真器和调试器。该平台提供对整个 PC 平台的仿真,包括一个或多个处理器和各种不同的 PC 外围设备,比如硬盘、显示器、CD-ROM 驱动器以及其他常用外围设备。您可以使用 Bochs 来运行针对 PC 平台的操作系统,它还是一个适用于操作系统开发的理想应用程序(因为除了 Bochs 提供的调试功能外,在来宾机器内可以隔离开发中操作系统的崩溃)。虽然 Bochs 通过仿真完成此操作,但是却以性能为代价。

让我们快速浏览并了解仿真和目前更常用的虚拟化方法之间的不同。

平台仿真

Bochs 是一种平台仿真器,这意味着它其实并不是现代意义上的虚拟化,而是模拟。在虚拟化中,虚拟机监控程序和虚拟机(VM)在裸机硬件上执行(通常通过硬件指令,虚拟机监控程序创建环境在 VM 之间共享硬件)。因为通过主机处理器直接执行指令,所以此过程通常被称为直接执行。此种类型的虚拟化使用来自现代处理器的支持(如 Intel Virtualization Technology for x86 [VT-x] 或 AMD virtualization [AMD-V])。仿真通常在 VM 和底层硬件和操作系统之间提供层以便创建如图 1 中所示的预期的平台环境的幻想。

图 1. 虚拟化 vs.仿真
图片显示了虚拟化和仿真之间的不同
图片显示了虚拟化和仿真之间的不同

仿真还常常解释来宾 VM 的指令(与虚拟化相比,此处来宾的指令集架构必须与主机相同)。这就为仿真建立了有趣的优势,此处来宾 VM 平台完全不同于主机(例如,在 IBM® PowerPC® 目标上运行 x86 来宾)。

仿真的另外一个有趣的优势就是对环境的完全控制,即更容易暂停整个机器来检查其状态以及将任何类型的故障引入仿真以测试操作系统的错误树。虽然此功能以性能为代价,但是它才是此类环境的真正好处。此外,仿真器提供了来宾机器与主机的真正隔离。这样,仿真器可以提供完全透明的环境。

仿真性能

在某些情况下仿真可用于性能架构。一个示例就是 Transmeta 创建的代码融合技术。Transmeta 的处理器是可以仿真 x86 代码序列的超长指令字(Very Long Instruction Word,VLIW)超级标量架构。它通过仿真或动态编译代码系列(类似于 QEMU 功能)来实现这一点。Transmeta 在 1995 年开启了其大门,然后又在 2007 年底将其关闭。

其他示例包括 Java 技术,它从 Java 字节码到主机的底层架构得到解译。Java 技术实现了实时(just-in-time,JIT)编译以便解决一些效率低下工作,类似于 Transmeta 和大量其他的仿真解决方案(包括 QEMU,它是另外一种类似于 Bochs 的平台仿真解决方案)。但是 Bochs 也实现了高效仿真(在现代处理器上高达每秒钟 1 亿条指令 [MIPS]),同时还是便携的。对于解译的 x86 指令执行和平台仿真,Bochs 完全是用 C++ 语言开发的。

Bochs 实现

现在,让我们探究 Bochs 的内部机理以便了解它如何在纯 C++ 实现中实现有用的性能。本文专注于仿真的两个方面:CPU(指令集架构 [ISA] 仿真)和设备。

CPU 仿真

Bochs 在其仿真方法方面很独特。虽然其他解决方案提供了直接执行或 JIT 编译,但是 Bochs 实现了 CPU ISA 的纯仿真(包括在对称多处理配置中通过多达八个 CPU 支持 x86 和 x86-64 CPU 仿真)。Bochs 提供了真正 CPU 的仿真,甚至达到仿真 CPU 的提取-解码-执行流的水平。在流阶段中,Bochs 执行权限检查,然后提取操作码。在解码阶段,Bochs 将已提取的 x86 指令解码为内部表示。它还通过存储原始 x86 系统的 “微操作” 来维护指令缓存(其后可在没有解码开销的情况下提取),进而改进性能。最后,在执行阶段,Bochs 执行一些围绕特定指令执行的操作(包括操作数的有效地址计算,然后针对特定指令执行方法执行间接调用)。在执行指令时,可(适当地)更新任何受影响的寄存器和标志。Bochs 在此处提供名为迟缓标志更新 的优化以便仅在需要算术标志时才计算这些标志(而不是在每一步都进行更新)。

在提取-解码-执行流之外,Bochs 还管理着诸如设备中断等外部事件和其他必要功能,如字节交换和其他特权检查。除了通用 x86 CPU 以外,Bochs 实现了许多 CPU 功能,如使用 MMX™ 技术的 Intel Pentium® 处理器;Intel 的流式单指令,Multiple Data Extensions 2(Multiple Data Extensions 2,SSE2);以及 AMD 3DNow! 指令。

Bochs 的内部指令缓存为传统 JIT 编译进行了很好的权衡。虽然 JIT 编译为加快执行提供了一些优势,但是这是以巨大的内存为代价进行的。

设备仿真

通过基于设备类型的设备仿真,Bochs 提供了对 PC 平台的仿真。例如,虽然键盘是主机和来宾机之间共享的物理设备,但是磁盘是通过仿真共享的,在这里来宾磁盘是主机磁盘文件系统中的文件。

Bochs 提供了一系列有用的仿真硬件,包括内存、NE2000 以太网卡、Cirrus Logic 显卡(PCI 或 ISA)、Intel 440FX PCI 芯片组、BIOS、USB 根集线器、Sound Blaster 声卡以及磁盘和软盘控制器。如同 CPU,这些设备也被仿真,这在整个过程中会引入相当大的开销。例如,在驱动程序与硬件进行通信时,它操纵寄存器以便请求一些所需的设备操作。在仿真平台中,代表设备的寄存器和内存将被仿真。在来宾操作系统的驱动程序窥探内存和硬件寄存器时,软件存在于下面来仿真设备(参见图 2)。除了仿真界面以外,设备仿真必须执行预期操作,这意味着会有设备的仿真,且在主机平台中可能有与物理设备的通信(如物理网络接口卡 [NIC] 或物理磁盘)。

图 2. 通过仿真进行设备虚拟化
图片显示通过仿真进行的设备虚拟化
图片显示通过仿真进行的设备虚拟化

使用 Bochs

Bochs 及其实用程序很简单,用于仿真各种不同的来宾操作系统。本示例演示了来自贝尔实验室操作系统的 Plan 9 的仿真。

安装 Bochs

首先,如果您的系统上没有 Bochs,则必须先安装 Bochs。对于我的 Ubuntu 系统来说,我使用了 apt 程序包管理器来安装必要的程序包:

$ sudo apt-get install bochs
$ sudo apt-get install bochs-x

此命令安装 Bochs IA-32/64 PC 仿真器和 Bochs X-11 仿真器。

为 Plan 9 安装做准备

要在 Bochs 上仿真 Plan 9,对于您的虚拟环境来说您需要另外两个东西:包含 Plan 9 安装映像的 CD-ROM 和作为安装目标的虚拟硬盘(Virtual Hard Disk,VHD)。

首先,从贝尔实验室站点获得 Plan 9 映像,正如下面的命令行所示:

$ wget http://plan9.bell-labs.com/plan9/download/plan9.iso.bz2
$ bunzip2 plan9.iso.bz2

Plan9 映像是可以使用 ISO 9660 格式解译的 ISO 格式文件(如同 CD-ROM 驱动器仿真,很快会讲到)。

下一步是创建您的 VHD。请记住这将是主机操作系统中的一个文件。Bochs 提供特殊的实用程序来创建这个称为 bximage 的文件。Bximage 实用程序是交互式的,允许您为如何创建并管理文件而指定一些选项。清单 1 提供会话来创建 VHD。在调用 bximage 之后,您可以指定您想创建硬盘映像(而不是软盘映像)。虽然 Bochs 可以支持许多映像类型,但是对于性能来说,则要求平面映像,这是因为运行时动态增长是没有必要的。对于 Plan 9 安装来说,其操作系统需要大量的空间,因此根据硬盘文件的名称(c.img)指定 700MB 的磁盘。

清单 1. 使用 bximage 为 Bochs 创建 VHD 映像
$ bximage
========================================================================
                                bximage
                  Disk Image Creation Tool for Bochs
        $Id: bximage.c,v 1.34 2009/04/14 09:45:22 sshwarts Exp $
========================================================================

Do you want to create a floppy disk image or a hard disk image?
Please type hd or fd. [hd] 

What kind of image should I create?
Please type flat, sparse or growing. [flat] 

Enter the hard disk size in megabytes, between 1 and 129023
[10] 400

I will create a 'flat' hard disk image with
  cyl=1422
  heads=16
  sectors per track=63
  total sectors=1433376
  total size=699.89 megabytes

What should I name the image?
[c.img] 

Writing: [] Done.

I wrote 314302464 bytes to c.img.

The following line should appear in your bochsrc:
  ata0-master: type=disk, path="c.img", mode=flat, cylinders=1422, heads=16, spt=63
$ ls -la c.img
-rw-r--r-- 1 mtj mtj 733888512 2010-12-19 14:30 c.img
$

安装 Plan 9

有了 CD-ROM 映像和硬盘映像,下一步是创建您的 Bochs 配置文件。此文件定义了应如何执行 Bochs 仿真,同时指定在何处查找环境的关键方面(ISO 文件、硬盘映像等)。Bochsrc 配置文件如 清单 2 所示。此文件定义一个 x86 平台,带有 128MB 的 RAM 、鼠标、默认的扩展图形阵列显示器、硬盘(定义为 ata0-master,通过 bximage 创建)、CD-ROM(定义为 ata1-master,指向您已下载的 plan9.iso 文件)、用于 Bochs 输出的日志文件 (bochsout.txt) 以及 CD-ROM 的默认根设备。

清单 2. Bochsrc 配置文件
# bochsrc
#
megs: 128
#
mouse: enabled=1
#
ata0-master: type=disk, path="c.img", mode=flat, cylinders=609, heads=16, spt=63
ata1-master: type=cdrom, path=./plan9.iso, status=inserted
#
log: bochsout.txt
#
boot: cdrom

Bochs 通过配置文件提供大量可表达的选项。这些选项可定义在平台上可用的选项或表达的选项类型(例如,诸如 SSE 或高级加密标准扩展等的单个 CPU 配置)。

要开始将 Plan 9 安装到 Bochs,在与您的磁盘映像、ISO 映像和 bochsrc 文件相同的目录中通过 -q 选项(以便跳过启动菜单)启动 Bochs:

$ bochs -q

此命令创建表示仿真平台的新窗口,如图 3 所示。如图所示,仿真器已经确认了您的磁盘和 CD-ROM 并已经启动了 CD 来开始安装 Plan 9 操作系统。

图 3. 启动 Bochs(Plan 9 操作系统的安装)
启动 Bochs(Plan 9 操作系统的安装)
启动 Bochs(Plan 9 操作系统的安装)

随着安装的继续进行,Plan 9 经过了各种不同的配置和安装步骤。图 4 显示了磁盘设置(分区)。

图 4. 安装 Plan 9 操作系统
图片显示了 Plan 9 操作系统的安装
图片显示了 Plan 9 操作系统的安装

这些示例中使用的视窗系统是 Plan 9 的 rio。Rio 是一种具有一些独特属性的有趣视窗系统。例如,在 rio 中的窗口是其自身的私有命名空间并将文件系统界面导出到在操作系统中运行的应用程序(允许 rio 在 rio 窗口内运行)。Rio 早于 UNIX® 的 X 视窗系统并为随后的视窗系统提供了技术基础。

在漫长的安装完成时,仿真计算机停止且更新 bochsrc 文件以便从磁盘启动(boot: disk)。请注意窗口的顶部(参见图 5)是显示了处于活动状态的元素(CD-ROM、鼠标)的 Bochs 控制,在右侧是一组控件(用于重置、暂停或关闭仿真计算机)。

图 5. 在 Bochs 上下文中运行的 Plan 9
图像显示了在 Bochs 上下文中运行的 Plan 9 操作系统
图像显示了在 Bochs 上下文中运行的 Plan 9 操作系统

运行其他操作系统

仿真的乐趣之一就是能够以快速而简单的方式方便地运行其他操作系统。您可以在 Bochs 站点上(参见 参考资料)查找磁盘映像列表,尝试一些其他的操作系统,如 FreeDOS、DLX Linux®(10MB Linux 图像)、OpenBSD、GNU/Hurd 以及 KNOPPIX。图 6 显示了在 Bochs 上启动的 FreeDOS 内核。

图 6. 在 Bochs 上运行 FreeDOS
图像显示了在 Bochs 上运行的 FreeDOS 操作系统
图像显示了在 Bochs 上运行的 FreeDOS 操作系统

FreeDOS 是在 Microsoft 宣称其不再生产 MS-DOS 后创建的项目,并被许多公司在 GPL 下使用。

其他仿真平台

虽然 Bochs 对于平台仿真来说是有用的应用程序,但是其他解决方案也提供了相似的功能。QEMU 是最流行的仿真器之一,因为它不仅提供与 PC 兼容的平台仿真而且还提供各种不同的其他处理器架构(ARM、PowerPC 等)。

其他专业平台包括 SPIM(一个 MIPS 处理器仿真器)和计算机历史仿真项目,该项目提供许多具有历史意义的计算系统(Altair、VAX 11/780、IBM 1130 等)的平台仿真。

前景展望

虽然 Bochs 是用于执行旧版操作系统的强大的平台仿真器,它也是一个用于开发操作系统的理想平台。Bochs 提供在原始硬件(包括全功能图形调试器)中不易提供的高效平台仿真和调试功能。虽然没有什么可以取代软件测试的真实硬件,但是 Bochs 可以提供在各种不同的 x86 和非 x86 主机中便于访问的有用开发环境。


相关主题

  • Bochs Web 站点 是Bochs 的最新版本以及新闻、文档、磁盘映像样例的主要来源,可访问邮件列表来解决您可能遇到的任何问题。您也可以在站点上输入错误报告获取其他信息。
  • Bochs 的详细细节以及在没有直接执行的情况下其如何提供高效平台的信息,请参阅由 Darek Mihocka 和 Stanislav Shwartsman 所著的文章 Virtualization without Direct Execution or Jitting: Designing a Portable Virtual Machine Infrastructure
  • Transmeta 公司开发了 VLIW 架构,其中包含有效执行 x86 指令集的技术。Transmeta 构建了两个处理器:Crusoe 和 Efficeon(相对于 Crusoe 的 128 位字来说,它具有 256 位指令字)。 Transmeta 开发了代码融合技术,将 x86 指令转换为本机 VLIW 以便执行。虽然 Transmeta 不再存在,但是您可以在 Wikipedia Transmeta 页面 上阅读该技术的概述。您还可以在 VLIW 架构 上发现有趣的页面;此页面还确认了一些使用 VLIW 的有趣 CPU 架构。
  • QEMU 是整个计算机系统的开源仿真器并提供完全虚拟化解决方案(通过仿真)。您可以在 使用 QEMU 进行系统仿真(developerWorks,2007 年 9 月)中了解有关 QEMU 的更多信息。QEMU 是在各种不同主机上运行并仿真许多不同架构的便携仿真器。
  • Marat Fyzullin 提供了有关 编写计算机仿真器 主题的良好介绍。除了高级主题以外,Fyzullin 还探究了 CPU 仿真如何与其他方面(如内存)的仿真一起实现。
  • 贝尔实验室于 20 世纪 80 年代创建了 Plan 9 操作系统 作为研究操作系统和 UNIX 的后继系统。Plan 9 以文件形式而不是特定设备表示所有系统接口。它继续为业余爱好者社区所开发用于研究。在 来自 Rob Pike 的演示文稿 中,您还可以了解有关 Plan 9 视窗系统 rio 的更多信息。对于那些希望在其最喜欢的操作系统(如 Linux)中试验 Plan 9 的应用程序的人来说,来自用户空间的 Plan 9 提供了很多重要组件的用户空间实现。
  • developerWorks Linux 专区 寻找为 Linux 开发人员(包括 Linux 新手入门)准备的更多参考资料,查阅我们 最受欢迎的文章和教程
  • 在 developerWorks 上查阅所有 Linux 技巧 Linux 教程
  • 随时关注 developerWorks 技术活动网络广播
  • 以最适合您的方式 IBM 产品评估试用版软件 :下载产品试用版,在线试用产品,在云环境下试用产品,或者在 IBM SOA Sandbox for People 中花费几个小时来学习如何高效实现面向服务架构。

评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Linux
ArticleID=631634
ArticleTitle=使用 Bochs 进行平台仿真
publish-date=03102011