模拟器是一种“虚拟机”,旨在解决一个简单的问题:缺少真实的硬件。过去系统的模拟器解决了真实硬件的丢失问题,并在真实硬件消失后保持了软件的可用性。未来系统的模拟器解决了未来硬件设计的多变性问题,并促进了在真实硬件存在之前进行软件开发。
SIMH,计算机历史模拟系统,是针对具有历史意义的过时系统的行为模拟器。最初旨在作为一个教育项目,但越来越多地在长期运行的生产环境中用作真实系统的替代品。SIMH正在不断扩展以模拟新的机器。
“虚拟机”一词已被用来描述至少三种不同类型的计算机程序
1. 虚拟化计算机操作系统(hypervisor),由VM/370率先推出,如今通过VMWare等产品实现商业化。虚拟hypervisor允许单个系统同时运行多个操作系统环境。
2. 由解释性环境(如今天的Java和C#,以及早期时代的许多其他项目)生成的抽象计算机系统。虚拟机解释器允许代码在不兼容的指令架构之间移植。
3. 模拟或仿真的计算机系统,如SIMH (http://simh.trailing-edge.com),它回顾了35年前的行为模拟器,如MIMIC。1 模拟器创建虚拟机,可以运行其他系统的代码,通常是因为其他系统不再存在或尚未存在。
所有虚拟机都面临着一组共同的问题:(1)它们必须忠实地再现目标;(2)它们必须能够忠实地再现软件期望的环境(时序、I/O等);以及(3)它们必须提供足够的性能才能成为可用的环境。
SIMH是一个用于过时计算机系统的开源模拟系统。其目的是保存计算的历史遗产——包括硬件和软件——并使任何拥有个人电脑的人都可以访问具有历史意义的系统。SIMH由一个名为SCP(模拟器控制包)的通用框架和超过20个系统的独立模拟器组成
• DEC: PDP-1, PDP-4, PDP-7, PDP-8, PDP-9, PDP-10, PDP-11, PDP-15, VAX
• Data General: Nova, Eclipse
• IBM: 1130, 1401, 1620, System/3
• Interdata: 16位和32位系统
• 其他: Royal-Mcbee LGP-30, SDS 940, Honeywell H316, GRI-909
SIMH是可移植的,可以在Windows、Linux和大多数其他Unix版本、Mac OS X和VMS(虚拟内存系统)上运行。SIMH的总体设计已在其他地方描述过;2 本文重点介绍编写模拟器的实际实现问题,以及必须解决的常见问题。
为过时系统编写模拟器需要历史研究、软件工程和侦探工作,这三者几乎各占三分之一。
任何模拟器的基本基础都是目标系统的准确规范。虽然现代架构都有详细的规范,但历史系统的描述往往是粗略的。此外,时间在历史记录中造成了空白:手册被丢弃,原理图丢失,实际的机器示例被报废。与大多数形式的历史研究一样,主要来源(原理图、微代码清单和维护文档)是最好的;二手来源,如手册、营销材料、教科书,甚至用户手册都不可信。
互联网为模拟研究提供了多个起点
• 收藏家、大学和博物馆已经抄录并出版了他们的私人文档档案。
• 搜索引擎可以提供指向专门介绍历史计算或特定感兴趣系统的网页和网站的指针。
• 文档,有时甚至是完整的系统,会在eBay上出售。
几个新闻组致力于过时系统和模拟。
尽管如此,即使对于最流行的系统,硬件和软件的生存也是碰运气的。例如,Unix版本1-4似乎已无可挽回地丢失了。另一方面,PDP-15 XVM/DOS的源代码——并非完全是广泛使用的操作系统——在eBay上的一组DECtapes中被发现。
一旦掌握了足够的文档,下一个阶段就是设计和实现模拟器。某些设计决策至关重要:如何将硬件系统架构映射到软件中?如何表示内存和I/O设备?如何处理异步性(模拟时间)?
SIMH按如下方式处理这些问题
SIMH使用PMS(处理器-内存-开关)符号的变体来映射硬件架构。3 模拟器是设备的集合;CPU只是一个执行指令的设备。设备由寄存器(保存状态)和单元(包含数据集)组成。例如,磁盘控制器是一个设备。它的寄存器是控制器状态。单元代表磁盘驱动器,每个驱动器都有一个数据集。
SIMH通过统一映射到主机系统容器来表示内存和I/O数据集。 所有容器都是C整数数据类型。例如,一个12位内存将由一个C unsigned short数组(通常为16位)表示。I/O设备的容器通常是磁盘文件,尽管它们也可以映射到真实设备,如软盘或CD驱动器。
SIMH显式地模拟计算机系统的异步操作。 模拟器以任何方便的单位(纳秒、指令)跟踪模拟时间。“异步”操作的设备在“未来时间”安排事件。当模拟器到达适当的时间时,它会调用设备事件处理程序来执行异步操作。
一旦确定了高级设计问题,就可以详细设计和编码模拟器,通常是从CPU到外围设备。CPU设计最为复杂:如何解码和执行指令?CPU如何与I/O设备通信?如何处理异常和中断?应包括哪些调试工具?典型的SIMH模拟器按如下方式处理这些问题
指令执行模拟真实系统的行为,包括取指阶段、地址解码阶段和指令执行。通常,指令分解只是一个大型的case语句。这速度很快,并模拟了微代码的结构,但可能体积庞大且难以阅读。
• CPU实现到I/O设备的正式的、可配置的接口,通常具有与真实系统的I/O总线相同的基本操作。这些接口允许在运行时构建I/O调度表,以便可以根据需要包含或排除I/O设备。
• 异常通常以与硬件中相同的方式处理:通过全局陷阱(C longjmp)到中央异常例程。这在现代面向对象语言中是令人厌恶的,但准确地模拟了许多真实系统的工作方式。
• 中断被建模为平衡准确性和模拟速度。对于复杂优先级中断系统,最好的方法是在任何可能更改中断系统状态的事件(例如,I/O指令)之后,使用中央例程评估中断系统的状态。
• 所有模拟器都为内存提供符号汇编和反汇编、执行断点、单步执行和PC更改历史记录。有些模拟器提供深度指令跟踪功能或多种类型的断点。
现在模拟器已准备好使用手动测试用例或诊断程序(如果可用)进行初始调试。
最后阶段是启动操作系统和其他操作软件。理论上,运行诊断程序的模拟器应该可以运行任何操作系统。但在实践中,由于多种原因,情况并非如此
软件可能不完整。 尝试启动PDP-15 ADSS(高级系统软件)因缺少正确的纸带引导程序而受阻。最终,在法国找到一个PDP-9引导程序,但没有纸带阅读器来转录它。法国的收藏家在平板扫描仪上分段扫描磁带,然后编写了一个程序来识别和转录孔洞并将转录的片段拼接在一起。然后,PDP-15模拟器编写者通过调试ADSS的启动过程,发现了PDP-9和PDP-15之间发生的更改。
软件路径可能未经测试。 尝试启动PDP-10 TOPS-10 7.04时,发现安装例程在处理磁带时存在错误。7.04的“新系统”安装路径从未经过测试,因为当7.04在1988年发布时,PDP-10已经停产六年了,所有安装都是升级。
模拟器配置可能未经测试。 模拟器比真实硬件便宜得多,并且很容易构建一个模拟配置,在现实生活中,无论是在财务上还是在物理上,这都是完全不切实际的。例如,当软件尝试“调整大小”固定磁头磁盘时,PDP-15 DOS的初始启动失败。模拟器实现了最大尺寸为200万字(八个盘片)的磁盘。然而,在现实世界中,从未构建过这样的配置,因为它太昂贵了。调整大小代码包含一个错误,该错误在最大配置上无限循环。
软件可能依赖于未准确模拟的时序或实现细节。DEC的MSCP磁盘控制器被证明特别难以正确实现。PDP-11上的RSTS/E和RSX11M,以及VAX上的NetBSD,在其MSCP驱动程序中存在时序依赖性(而且时序依赖性也不同)。截至本文撰写之时,OpenBSD/VAX的MSCP驱动程序仍然存在时序问题,尽管VMS、Ultrix或BSD 4.3不存在时序问题。
在所有这些情况下,调试工具都是操作系统。操作系统非常擅长发现模拟器中的错误,但它们的报告机制——挂起、崩溃或循环——还有待改进。因此需要在模拟器中提供强大的调试工具。调试工具不是用来调试软件,而是用来调试模拟器本身。
任何形式的虚拟机都必须处理三个关键问题:准确性、软件依赖性和性能。
准确性
对于SIMH,模拟的准确性一直是关键要求。这源于一个简单的观察:模拟越准确,它将正确运行的软件就越多。实现中的关键选择是模拟级别(行为级、寄存器传输级);模拟细节程度(指令级准确、周期级准确);以及实现的具体性(架构准确性、特定模型准确性)。
模拟级别。 大多数模拟器都是行为级的:它们再现计算机系统的行为,而不是其内部实现。尽管可能存在相似之处(例如,抽象为数组的寄存器文件),但这些都是巧合。没有尝试再现系统的“逐个击破”的内部操作。例如,典型的20世纪60年代的小型计算机将通过特定的缓冲寄存器访问内存
MAR <- memory_address;
MBR <- memory_access ();
内存目标 <- MBR;
行为模拟器抽象出中间寄存器传输
内存目标 <- memory_access (内存地址);
相比之下,寄存器传输级模拟器确实包括硬件中间步骤的细节。
SIMH是一个行为级系统。即便如此,大多数SIMH模拟器都非常精确地遵循硬件流程,并准确地模拟系统结构。
模拟细节程度。 “细节决定成败”这句老话尤其适用于模拟器。处理器和外围设备的行为需要非常精细地再现,否则软件将无法运行。一些例子
1. 关于HP 16位计算机系统(2100系列,后来更名为1000系列)的每本已出版的手册都声明,SFS和SFC指令不实现“清除标志”选项。然而,原理图清楚地表明,这些指令确实实现了该选项;HP的RTE-IV操作系统依赖于这个未公开的功能。
2. PDP-11中断应该遵循明确定义的模型,但随着越来越多的外围设备被实现,由于“改进”或优化,出现了与模型的偏差。PDP-11的以太网和Massbus控制器的特有的中断行为——即使中断使能标志被清除,它们也不会禁用挂起的中断——必须“按错误还原错误”地再现,否则PDP-11 Unix将无法运行。
3. Honeywell 316模拟器仅指定了“通用A”操作指令类中可能的位组合中的少量组合。为了再现其他位组合的未定义但并非不可预测的行为,模拟器必须逐个信号地再现解码逻辑,因为通用A操作是逐个信号进行的。
在最后一种情况下,模拟器预测的结果与唯一发表在该主题上的文章的结果不同;在真实硬件上的测试证明模拟器是正确的。
模拟的具体性。 最后,模拟器必须再现特定且完整的系统,而不是理想化的架构模型。对于早期的计算机系统来说,这已经足够清楚了,因为它们早于兼容计算机系列的概念,但对于规范良好的系统来说,情况也是如此。SIMH不模拟“PDP-11”或“VAX”;它模拟PDP-11/73和MicroVAX 3900。偏差可能是危险的
• PDP-11架构未指定双操作数指令中解码和获取操作数的顺序,不同的PDP-11实现了不同的顺序。PDP-11软件不应依赖此顺序。然而,实现特定模型的PDP-11模拟器必须以完全正确的顺序实现双操作数处理;否则,主要操作系统(RSX11M+)中的“模型识别”软件将无法获得正确的答案。
• 需要不同的模型来适应不同的软件环境;例如,早期的PDP-11 Unix系统仅在PDP-11/45上运行,并且必须通过特定的控件调用,作为主要模拟环境的替代方案。
SIMH具有用于处理软件对真实机器环境的依赖性(如I/O格式、I/O时序依赖性和真实世界时序依赖性)的显式机制。我已经描述了I/O格式和异步操作的处理;本节重点介绍真实世界时序依赖性。
挂钟时间与模拟时钟。 模拟性能随主机处理器的速度而变化。如果模拟器通过计数指令或周期来跟踪时间,那么模拟时间在快速机器上会运行得更快,而在慢速机器上会运行得更慢。这使得模拟软件很难跟踪“挂钟时间”。
SIMH提供校准的定时器。 周期性事件(例如实时时钟的滴答声)最初是通过猜测来安排的。随着模拟的进行,SIMH根据挂钟时间校准时钟,并自动调整时钟滴答之间的模拟延迟,以近似实时。
时序循环。 一些程序,尤其是游戏,需要更高的时序精度。例如,世界上的第一个视频游戏PDP-1 Spacewar在一个巨大的循环中运行,该循环的速度与真实PDP-1的性能相匹配。如果循环运行得太快——在现代硬件上,模拟的PDP-1比原始硬件快100倍——宇宙飞船将在用户做出反应之前飞速掠过屏幕并坠入太阳。
模拟器可以使用校准的定时器和模拟器特定的时序机制来计算指令执行速率。如果该速率太高,模拟器可以运行空闲循环或进入睡眠状态,以将模拟执行速度减慢到真实世界的速率。
模拟处理器和I/O性能。 模拟器通常需要执行大量指令才能执行一条模拟指令:对于像VAX这样的复杂模拟器,高达1000:1。在现代计算机上,模拟器主机和模拟目标之间的时钟频率差异(现代PC为3 GHz,而PDP-8为0.8 MHz或MicroVAX II为5 MHz)通常足以克服不利的模拟比率。此外,由于外围设备的改进以及大量使用内存进行缓存和缓冲,现代计算机上的I/O比历史系统快得多。综上所述,改进可能是巨大的:一位SIMH用户报告说,一个复杂程序构建的运行时间从真实MicroVAX 3100-38上的2.5小时减少到模拟器上的14分钟。
模拟器受益于微处理器性能的提高。缓存命中率很高,因为指令流相对较小,并且数据集受到历史内存大小的限制。另一方面,分支很频繁,分支可预测性很差。一般来说,模拟器在具有高时钟频率、浅流水线、大型一级指令流缓存和大型二级数据流缓存的微处理器上运行效果最佳。
规模。 对于历史系统,模拟器规模不是问题,因为规模受到真实系统限制的限制。模拟512 MB的PDP-11不是问题,因为真实的PDP-11被限制为4 MB。然而,模拟器也用于重新创建相对较近来源的系统,例如Hercules 370模拟器或SIMH VAX模拟器。对于现代架构的模拟器,规模当然是一个问题。
在去年,SIMH VAX的用户请求比原始目标系统MicroVAX 3900提供的更大的内存和存储容量。幸运的是,VAX架构在某种程度上抽象了内存和存储表示的细节。在VAX架构中,内存大小由引导代码呈现给操作系统;操作系统不需要了解底层内存系统的详细信息。同样,在MSCP中,磁盘驱动器大小由驱动器本身呈现给操作系统;操作系统应处理任意大小的驱动器。这些抽象允许将内存从64 MB扩展到512 MB,只需更改模拟器和引导固件,并将驱动器容量扩展到1 TB(!)只需更改模拟器的I/O例程即可处理大于2 GB的文件。
SIMH已成功地重新创建了涵盖计算机历史40年跨度的机器,使用了通用的设计和控制框架以及通用的实现技术。如果遵守以下三个简单规则,SIMH可以很容易地扩展以模拟其他系统
• 彻底研究要模拟的系统。
• 在开始实现之前,仔细研究硬件架构到软件结构的映射。
• 运行尽可能多的真实软件来调试模拟器操作。
只要有一点运气和大量的调试,任何人都可以打开计算历史中另一个被锁定的宝藏。
1. Supnik, R. “模拟下的调试”,载于大型系统中的调试技术,R. Rustin编辑。Prentice-Hall,1971年。
2. Supnik, B. SIMH系统模拟器编写,2004年2月11日修订,http://simh.trailing-edge.com。
3. Siewiorek, D.、Bell, G.和Newell, A. “PMS符号”。第13章,载于计算机结构:原理和示例。 McGraw-Hill,1982年。
喜欢它,讨厌它?请告诉我们
[email protected] 或 www.acmqueue.com/forums
BOB SUPNIK 通过收购Nauticus Networks加入Sun Microsystems,他在Nauticus Networks担任首席技术官和工程副总裁。在他的职业生涯的大部分时间里,他都是Digital Equipment Corporation的高级经理和技术领导者,在那里他领导了DEC的VAX微处理器的开发;启动并项目管理了整个Alpha工程项目(芯片、系统和软件);并管理了帕洛阿尔托互联网交换中心、Personal Jukebox和其他创新研究产品的创建。他拥有麻省理工学院的数学学士学位和历史学士学位,以及布兰迪斯大学的历史学硕士学位。Supnik拥有七项硅和系统架构专利。他是计算机历史模拟项目SIMH的主要开发者。
© 2004 1542-7730/04/0700 $5.00
SIMH模拟具有历史或架构意义的系统——或者,在许多情况下,是作者个人感兴趣的系统。例如,LGP-30是我见过的第一台计算机。它建于20世纪50年代中期,使用磁鼓作为内存(全部4000字)。它的计算能力不如今天的廉价计算器。IBM 1620是我编程的第一台计算机。它建于20世纪50年代后期,因其低成本(仅64,000美元——按1960年美元计算)而受到大学的欢迎。它使用查表法实现十进制算术,因此得名Cadet——“不会加法,甚至不想尝试”。
PDP-1是一台18位计算机,于1960年交付,是Digital Equipment的第一台计算机。它被用来开发世界上第一个视频游戏《太空大战》。DEC的PDP-8是一台12位计算机,于1966年交付,被认为是第一台小型计算机,因为它成本不到20,000美元,并且仅由半个机架的逻辑组成,而不是多个机架。PDP-8也是第一台大规模生产的计算机;生产了超过50,000台。
第一批16位小型计算机于20世纪60年代中后期交付。惠普的2100、Interdata的Model 3和Honeywell的H516都是早期16位小型计算机的例子。H516被用于实现ARPAnet IMP(高级研究计划署网络接口消息处理器),实际上是互联网前身的第一个路由器。1970年,DEC PDP-11和Data General Nova彻底改变了小型计算机架构。优雅而复杂的PDP-11是有史以来最流行的小型计算机,并影响了1970年代后期的许多系统,包括Intel x86;x86的“小端”字节顺序源于PDP-11。Nova的根本简洁性预示了1980年代的RISC(精简指令集计算机)架构。
32位计算随着20世纪70年代中期“超级小型机”Interdata 7/32和1977年的VAX的推出而突破了大型机的范畴。7/32托管了Unix的第一个端口,以及第一个到32位系统的端口。VAX是1980年代最流行的32位计算机,直到它首先被RISC,然后被PC超越。
最初发表于Queue vol. 2, no. 5—
在数字图书馆中评论本文
Jonathan Parri, Daniel Shapiro, Miodrag Bolic, Voicu Groza - 将控制权交还给程序员
服务器和工作站硬件架构不断改进,但解释型语言未能跟上现代处理器的正确利用率。SIMD(单指令多数据)单元几乎在每台当前的桌面和服务器处理器中都可用,并且被大大低估了,尤其是在解释型语言中。如果多核处理器继续目前的增长模式,解释型语言的性能将开始落后,因为当前的本机编译器和语言提供更好的自动化SIMD优化和直接SIMD映射支持。
Poul-Henning Kamp, Robert Watson - 构建安全共享的系统
计算的历史以持续的转变为特征,这种转变源于摩尔定律描述的性能大幅提升和价格下降。计算能力已从集中式大型机/服务器迁移到分布式系统和商品桌面。尽管发生了这些变化,系统共享仍然是计算的重要工具。从桌面环境的多任务处理、文件共享和虚拟机,到主机托管中心服务器级ISP硬件的大规模共享,在互不信任的各方之间安全共享硬件需要解决意外和恶意损坏的关键问题。
Poul-Henning Kamp, Robert Watson - 构建安全共享的系统
计算的历史以持续的转变为特征,这种转变源于摩尔定律描述的性能大幅提升和价格下降。计算能力已从集中式大型机/服务器迁移到分布式系统和商品桌面。尽管发生了这些变化,系统共享仍然是计算的重要工具。从桌面环境的多任务处理、文件共享和虚拟机,到主机托管中心服务器级ISP硬件的大规模共享,在互不信任的各方之间安全共享硬件需要解决意外和恶意损坏的关键问题。
Mendel Rosenblum - 虚拟机的轮回
虚拟机一词最初描述的是20世纪60年代的操作系统的概念:一种软件抽象,具有计算机系统硬件(真实机器)的外观。四十年后,该术语涵盖了广泛的抽象概念?例如,与现有真实机器不匹配的Java虚拟机。尽管存在差异,但在所有定义中,虚拟机都是程序员或编译系统的目标。换句话说,软件被编写为在虚拟机上运行。