Intel Simics 在工业界和学术界都有着悠久的历史。最初被称为全系统模拟器(full-system simulator),它于20世纪90年代初由瑞典计算机科学研究所(SICS,现为瑞典国家研究院RISE的一部分)在对多处理器架构的研究中开发而成。Simics 这一名称是Simulator from SICS的缩写。
Intel Simics 模拟器延续了学术界和计算机系统构建者所使用的全系统模拟器传统(当时"虚拟平台"这一术语尚未普及),尤其借鉴了 g88k 模拟器的设计理念。1998年,一家名为 Virtutech 的初创公司成立,旨在将该模拟器商业化;2010年,Intel 收购了 Virtutech,而当时的商业销售则由Intel子公司 Wind River 负责。
从一开始,运行在Intel Simics 模拟器上的虚拟平台就被用于两个经典应用场景:计算机体系结构探索和硅前(pre-silicon)软件开发(也称为"左移"开发)。随着时间推移,其应用范围逐步扩展到通用软件测试与开发领域,特别是在固件、操作系统、启动代码和嵌入式软件方面------在这些场景中,虚拟平台相比物理开发板提供了更高的便利性。
如今,Intel广泛使用 Simics 模拟器及其虚拟平台进行硅前软件支持与开发、计算机与系统架构研究、硬件验证、生态系统赋能等任务。该模拟器框架已被证明能够对当今最复杂的硬件平台进行建模,包括现代片上系统(SoC)内部众多由固件驱动的引擎。虚拟平台还能集成并交互各类外部工具和其他模拟器模型,例如周期精确的计算机体系结构模拟器、调试器、物理世界仿真器、大型硬件仿真器等。将性能、功耗和热模型与 Simics 功能模型相结合,构成了Intel集成仿真基础设施与建模(Intel® ISIM)的核心支柱之一。其底层仿真核心和调度器具备高速度和可扩展性,能充分利用多核主机加速仿真过程。
高性能仿真
Simics 模拟器最初的几个核心目标之一,就是通过功能级抽象(简化时序模型)快速运行目标系统代码。此外,那些会降低仿真速度的功能(如模拟架构级时序细节或追踪目标系统执行过程)应仅在需要时动态启用。
当前版本的模拟器采用了多种技术以提升仿真速度。它利用虚拟化技术,在Intel主机上加速Intel虚拟平台的执行;对于其他情况,则采用即时编译(JIT)技术来运行目标代码。早在2004年,早期 JIT 技术就已使 Simics 虚拟平台达到每秒十亿条指令(1 GIPS)的运行速度。模拟器核心还应用了时间解耦(Temporal Decoupling)技术以进一步加速仿真。
多核主机可用于加速仿真过程。若目标系统包含多个联网的板卡,模拟器可在单个仿真进程中并行运行它们;多个紧耦合的处理器核心也可在单个仿真进程中并行执行,从而加速多核或多处理器目标系统的仿真。JIT 编译器及其他服务会在独立线程上运行,即使对于单处理器目标系统也能提升性能。
在 Simics 虚拟平台中,模型之间的通信通常采用事务级建模(TLM)方式。非活跃处理器的模型由事件和事务驱动。即使在多核主机上并行运行,核心调度器仍为所有模型调用(除模拟的处理器核心外)提供简单的串行语义,从而避免在典型设备模型代码中处理复杂的线程同步问题。
特定系统模型
Simics 模拟器的关键用途之一是为特定硬件系统提供虚拟平台。为了支持 BIOS 和统一可扩展固件接口(UEFI)的初始化以及操作系统驱动程序的开发,必须精确建模特定机器的硬件设备语义和指令集。这与通用虚拟机系统不同------后者仅为软件提供底层硬件的虚拟副本。即便在Intel主机上模拟Intel平台,Simics 虚拟平台也对应于特定的处理器和芯片组,通常是尚处于开发阶段、尚未有实体硬件的未来平台。
Simics 模拟器在主机与目标系统之间提供完全隔离:任何受支持的主机均可仿真任意目标系统,且目标系统的语义不会因主机不同而改变。这意味着通用服务器、笔记本电脑、台式机或云实例均可用于运行特定虚拟平台,从而像使用真实硬件一样执行完整的软件栈。
Simics 模拟器可建模各种类型的目标系统,涵盖从用于硅前软件支持的尖端系统到非常老旧的嵌入式硬件。目标系统规模可小至单核处理器,也可大至包含数百台联网设备、搭载数十种不同类型处理器的庞大系统。
单个 Simics 虚拟平台可包含任意数量、任意类型的处理器。每个独立模型均封装在自己的动态加载库中,对特定仿真配置中可使用的模型类型、混合方式及连接方式没有任何限制。多年来,已有数百种不同的处理器变体被建模,包括8位微控制器、32位嵌入式处理器、64位服务器处理器,甚至一些特殊用途的数字信号处理器(DSP)。
构建大型仿真配置可能极为复杂:当前的平台模型通常包含数万个由数千个不同类创建的仿真对象。为管理这种复杂性,Simics 采用组件系统对子系统的创建和连接进行封装,清晰地区分了仿真系统的搭建/配置阶段与运行时行为。
灵活且动态的框架
Simics 仿真框架本质上是动态的。用户可随时在仿真过程中创建对象,并向模拟器动态加载新的模型类型。仿真配置也可随时修改,从而支持模拟诸如向网络添加板卡、插入 USB 存储设备、从背板拔出板卡或注入故障等事件。某些仿真配置选项(如时间解耦的时间量子长度)甚至可在仿真运行期间动态调整。
虚拟平台模型以二进制模块形式分发。每个模块是一个动态加载库,可包含一个或多个用于创建 Simics 仿真对象的类;通常一个模块对应一个硬件子系统模型,例如网卡、处理器核心或芯片组。这些模块被打包为 Simics 包(公开版本包含多个此类包)。模拟器核心负责从包中加载模块,并能处理来自不同包的同一模块的多个版本。
Simics 模块接口基于主机操作系统的 C 语言应用二进制接口(ABI)定义,因此具有稳定性,且与编程语言和编译器无关。只要能生成标准动态库并与 C 语言 API 链接,任何语言和编译器均可用于构建模块。官方支持的语言包括 C、C++、Python、Intel Device Modeling Language 和 SystemC。一个有趣的特例是将现有模拟器嵌入模块中,利用 Simics 仿真框架作为通用集成平台,整合来自多个来源的多种模拟器。
在脚本支持方面,命令行界面为大多数操作提供了易用环境,包括运行控制、配置查看与修改、目标软件调试、状态保存与加载、追踪与插桩等。命令行界面提供交互式帮助、命令及其参数的 Tab 自动补全功能,并支持自定义命令扩展。其底层是一个内嵌的 Python 解释器,可用于更高级的脚本编写,以及实现模型、桩函数(stubs)和测试。框架内置的断点系统为脚本提供了丰富的机制,使其能对仿真系统及模拟器中的事件和状态变化作出响应。
Simics 模拟器的应用程序编程接口(API)对所有用户开放,可通过命令行界面中的内联 Python 代码进行交互式调用。