联系 TimTim 是我们最受欢迎、作品最多的作家之一。浏览 developerWorks 上 Tim 的所有文章。查看 Tim 的个人资料 并与他以及 My developerWorks 中的其他作者和相关读者取得联系。 Bochs 是较小的 GNU 公共许可证(GNU Public License,GPL)下获得许可的一种 x86 PC 仿真器和调试器。该平台提供对整个 PC 平台的仿真,包括一个或多个处理器和各种不同的 PC 外围设备,比如硬盘、显示器、CD-ROM 驱动器以及其他常用外围设备。您可以使用 Bochs 来运行针对 PC 平台的操作系统,它还是一个适用于操作系统开发的理想应用程序(因为除了 Bochs 提供的调试功能外,在来宾机器内可以隔离开发中操作系统的崩溃)。虽然 Bochs 通过仿真完成此操作,但是却以性能为代价。 让我们快速浏览并了解仿真和目前更常用的虚拟化方法之间的不同。 Bochs 的起源虽然 Bochs 最初属于商业产品(由 Kevin Lawton 开发),但是在 2000 年初被 Mandrakesoft(现在是 Mandriva)收购且现在是在 GPL 下发布。 平台仿真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 完全是用 Bochs 实现现在,让我们探究 Bochs 的内部机理以便了解它如何在纯 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. 通过仿真进行设备虚拟化使用 BochsBochs 及其实用程序很简单,用于仿真各种不同的来宾操作系统。本示例演示了来自贝尔实验室操作系统的 Plan 9 的仿真。 安装 Bochs首先,如果您的系统上没有 Bochs,则必须先安装 Bochs。对于我的 Ubuntu 系统来说,我使用了 $ 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./plan9/download/plan9.iso.bz2 $ bunzip2 plan9.iso.bz2
下一步是创建您的 VHD。请记住这将是主机操作系统中的一个文件。Bochs 提供特殊的实用程序来创建这个称为 清单 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 、鼠标、默认的扩展图形阵列显示器、硬盘(定义为 清单 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 文件相同的目录中通过 $ bochs -q 此命令创建表示仿真平台的新窗口,如图 3 所示。如图所示,仿真器已经确认了您的磁盘和 CD-ROM 并已经启动了 CD 来开始安装 Plan 9 操作系统。 图 3. 启动 Bochs(Plan 9 操作系统的安装)随着安装的继续进行,Plan 9 经过了各种不同的配置和安装步骤。图 4 显示了磁盘设置(分区)。 图 4. 安装 Plan 9 操作系统这些示例中使用的视窗系统是 Plan 9 的 rio。Rio 是一种具有一些独特属性的有趣视窗系统。例如,在 rio 中的窗口是其自身的私有命名空间并将文件系统界面导出到在操作系统中运行的应用程序(允许 rio 在 rio 窗口内运行)。Rio 早于 UNIX? 的 X 视窗系统并为随后的视窗系统提供了技术基础。 在漫长的安装完成时,仿真计算机停止且更新 bochsrc 文件以便从磁盘启动( 图 5. 在 Bochs 上下文中运行的 Plan 9运行其他操作系统仿真的乐趣之一就是能够以快速而简单的方式方便地运行其他操作系统。您可以在 Bochs 站点上(参见 参考资料)查找磁盘映像列表,尝试一些其他的操作系统,如 FreeDOS、DLX Linux?(10MB Linux 图像)、OpenBSD、GNU/Hurd 以及 KNOPPIX。图 6 显示了在 Bochs 上启动的 FreeDOS 内核。 图 6. 在 Bochs 上运行 FreeDOSFreeDOS 是在 Microsoft 宣称其不再生产 MS-DOS 后创建的项目,并被许多公司在 GPL 下使用。 其他仿真平台虽然 Bochs 对于平台仿真来说是有用的应用程序,但是其他解决方案也提供了相似的功能。QEMU 是最流行的仿真器之一,因为它不仅提供与 PC 兼容的平台仿真而且还提供各种不同的其他处理器架构(ARM、PowerPC 等)。 其他专业平台包括 SPIM(一个 MIPS 处理器仿真器)和计算机历史仿真项目,该项目提供许多具有历史意义的计算系统(Altair、VAX 11/780、IBM 1130 等)的平台仿真。 前景展望虽然 Bochs 是用于执行旧版操作系统的强大的平台仿真器,它也是一个用于开发操作系统的理想平台。Bochs 提供在原始硬件(包括全功能图形调试器)中不易提供的高效平台仿真和调试功能。虽然没有什么可以取代软件测试的真实硬件,但是 Bochs 可以提供在各种不同的 x86 和非 x86 主机中便于访问的有用开发环境。 参考资料学习
获得产品和技术
讨论
|
|