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. 通过仿真进行设备虚拟化


相关内容

    暂无相关文章