为了获得新的能力,解决计算机系统主要组件连接界面的多种问题,操作系统、编程语言和编译器、计算机体系结构三个领域都发展了虚拟机技术。操作系统支持的虚拟机技术过去曾相对活跃过,现在又重新引起人们的兴趣,因为它可以在保持高度安全性的同时获得高效的资源共享。虚拟技术在服务器以及其他网络应用,尤其是对安全要求很高的领域越来越受欢迎。在编程语言方面,虚拟机提供了平台无关性,而且支持动态和透明的翻译和优化。在处理器体系结构方面,虚拟机技术允许引入新的指令集,做动态优化以降低功耗,提高性能。.
工业界对一些标准接口的巩固,使得虚拟机技术很可能在上面提到的各个领域的革新中起到重要的作用。新的指令集、操作系统、编程语言要想被广泛接受都需要与虚拟机技术结合。许多虚拟机技术发展的推动力及近来获得的大多数重要进步都来自工业界。
历史上,各种虚拟机技术都延伸到计算机科学和工程学科中。有许多潜在的cross-cutting技术,如果能发挥这些技术的作用就能够以更好的组织方式来进行虚拟机实现的研究和设计。本书是按统一的原则进行虚拟机技术研究的结果。
本书还介绍了对计算机体系结构的理解。按照传统的定义,体系结构就是一个接口。虚拟机把接口连在一起,同时扩大接口的灵活性和功能性。理解体系结构是理解虚拟技术的关键,本书从体系结构研究者的角度,首先保持与接口的相关问题的清晰,使得读者在阅读后对计算机系统接口的重要性,以及它们在计算机主要部件间相互作用时所扮演的角色有更深的认识。
虚拟机应用的广泛性意味着本书有各种各样需求的读者。虽然目前虚拟机还没有被大学作为一个学科来看待,但因为它与计算机科学和工程学的关键原理:体系结构、操作系统、编程语言和编译器的紧密结合,使得虚拟机成为研究生课程的一个很好的主题。本书的初版已经在四所不同大学的研究生课程中使用,并且取得了相当的成功。这本书可以作为关于动态优化的编译器课程或包含典型系统虚拟机的操作系统课程的辅助教材。虚拟机技术正在被工业界广泛而快速地接受,从事相关工作的专业人士将会发现本书也可以用于自学前沿技术。本书还可以作为一本参考资料,因为它收集了许多领域的资料。
本书首先总结了各种不同的虚拟机,从一个的视角建立起统一的讨论框架。后面的章节中将描述主要的几类虚拟机,突出它们之间的共同点和低层技术。下面里粗略地介绍一下每章的纲要。
第一章我们引入了在今天的计算机系统中流行的接口抽象概念和定义。随后讨论了虚拟化及它与接口的关系。接着介绍了计算机体系结构概念,然后总结了各种不同类型的虚拟机。虚拟机可以分为两个主要类型:进程虚拟机和系统虚拟机。在这一章的最后,我们深入讨论了虚拟机的分类,并提出一种虚拟机的分类方法。
第二章我们讨论用目标指令集仿真源指令集体系结构的相关问题。说明了基本解释程序的工作以及如何用线程化的解释(threaded interpretation)来提高性能,并使用Intel IA-32作为CISC源指令集,IBM PowerPC作为RISC目标指令集来说明所开发出的技术。接着我们介绍二进制转换的概念,并讨论代码发现和代码定位的问题。随后讨论控制转移的处理,许多指令集都有一些必须用特别方法处理的特殊性能(有些情况下,它们被称为“quirks”)。最后用一个在Shade模拟系统中仿真的例子来结束这章。
第三章讨论进程虚拟机的实现。进程虚拟机支持在由操作系统和低层硬件组成的主机平台上运行单独的客户应用程序。我们讨论虚拟机兼容性的含义,同时说明在一个进程虚拟机中机器状态,包括寄存器状态和存储器状态如何被映射和维持。这一章我们还研究虚拟机运行时软件如何使用自适应代码和存储器保护区。虚拟机的仿真包括两部分。首先讨论指令集的仿真,涉及到第二章中讨论的解释程序和二进制转换。接着讨论主机操作系统接口的仿真。最后我们介绍了 FX!32系统,FX!32系统包含很多我们在这章讨论的基本原理和思想。
第四章重点讨论用于进行代码优化以获得更好的仿真性能的技术。这一章讨论了执行这些优化所需的基本框架和为了帮助代码优化而在程序执行时必须收集的剖析信息。各种剖析技术都将被讨论。因为优化在更大的代码块上工作的更好,我们将介绍动态基本块(dynamic basic block)、超块(superblock)、轨迹(traces)和树组(tree groups)的概念。这一章还延伸讨论了代码重排序及其局限性。各种代码优化技术,包括块间及块内的优化技术都会介绍。最后通过对Dynamo的研究来总结这一章,Dynamo是动态二进制的优化器,应用于使用相同源和目标指令集的系统中。
第五章介绍了高级语言虚拟机,追溯了从早期的Pascal P-code虚拟机到面向对象的虚拟机。重点介绍高级语言虚拟机的体系结构,特别是他们支持面向对象编程和安全的特征。现今两个重要的面向对象虚拟机分别是Java虚拟机和微软的CLI,这一章描述了他们的字节码、面向栈的指令集等特征。在介绍这两种虚拟机时,对指令集的介绍都附以对增强虚拟机的库和应用程序接口集合组成的整个平台的介绍。
第六章继续讨论高级语言虚拟机,重点是它们的实现。在前面的章节中, 更多关注的是Java,因为他应用广泛而且有很多不同实现。要特别考虑的两个问题是安全和存储管理。垃圾收集的重要性和执行垃圾收集的技术放在一起讨论。随后讨论Java类与在Java环境外写成的程序的相互作用。我们讨论使用第四章提到的代码优化技术及使用针对面向对象模式的特定的新技术对提高Java性能的帮助。我们通过对Jikes Research虚拟机的研究把这章的概念综合到一起。..
第七章我们介绍协同设计(co-designed)虚拟机。在协同设计的虚拟机中,传统的指令集可以通过执行专门实现的(implementation-specific)指令集和在隐藏存储上执行的转换软件一起来实现。我们讨论把原始指令集的状态映射到执行指令集上,以及保持代码缓存中包含转换后代码的技术。许多棘手的问题,包括精确中断、缺页中断也在这里讨论。在这一章的结尾,我们研究了两个例子:Transmeta Crusoe处理器和IBMAS/400 处理器。
第八章涉及典型的系统虚拟机。系统虚拟机支持在主机平台上运行客户操作系统以及它所有的应用。我们说明提出系统虚拟机的动机,并概要介绍系统虚拟机的实现方法,包括本地的(native)和宿主(hosted)的虚拟机。我们还讨论对计算机系统三个主要资源:处理器、存储器、I/O的虚拟化技术。处理器虚拟化的条件最早由Popek和Goldberg在70年代阐明,现在已经得到发展。当指令集不符合这些条件时的虚拟化技术也会讨论。存储器虚拟化的讨论要同时注意结构的页表和结构的TLB系统。接着讨论各种I/O设备的虚拟化。然后我们把注意力转移到用硬件来提高虚拟机系统性能,并以IBM z/VM作为例子来说明。在本章最后研究两个例子:VMware开发的宿主虚拟机系统和Intel为他们的IA-32体系结构开发的VT-x(Vanderpool)技术。
第九章我们把注意力转移到多处理器系统的虚拟化,介绍系统分割的概念,并为不同类型的分割开发出一种方法。我们接着讨论物理分割和逻辑分割的原则。逻辑分割的一个例子是IBM LPAR,随后讨论是由系统管理程序进行逻辑分割。之后我们转向利用基于系统虚拟机对多处理器系统虚拟化。在这章的最后讨论对不同指令集的客户和主机平台的多处理器系统的虚拟化,特别考虑了客户与主机之间不同存储器模型之间的桥接。
第十章讨论虚拟机技术的新兴应用。我们把焦点放在我们觉得在未来几年将是很重要的三个应用领域。第一个是安全领域,我们讨论当代计算机系统易受攻击的弱点,并简单介绍入侵检测系统的原理,讨论了虚拟机在攻击防护和从攻击中恢复方面的应用潜力,我们还讨论了二进制重写技术在关于RIO系统的安全上扮演的角色。第二个应用是从一台机器到另一台的迁移计算(migrating computing)环境,这种技术被用在两个系统中:Internet 挂起/重启(Suspend/Resume)系统、Stanford Collective系统,我们讨论了这两个系统,并讨论了商业上的应用:VMware的VMotion。第三个新型应用是计算网格。我们略述以网格作为计算的基础设施的动机,并与其他类型虚拟机的动机进行比较。最后我们展示典型的系统虚拟机对新兴网格系统出现的重要作用。
附录其实是对计算机系统的浓缩,以提供本书主要章节的背景资料。这章讨论了处理器、存储器、I/O在计算机系统中的作用。然后讨论了指令集,包括对用户应用程序的支持和对操作系统的支持,也讨论了页表和TLB。随后我们讨论了操作系统的主要组件和应用程序与操作系统之间的系统调用接口。最后,我们讨论了多处理器体系结构,包括集群结构和共享存储多处理器系统,还讨论了共享存储多处理器系统中的存储一致性问题。
本书可以以不同的方法在课程中使用。大体上,这本书是按照把虚拟机作为一门课程的论题(这是我们推荐的方式)来组织的。对于讲述虚拟机的操作系统课,教师可以在介绍第一章后直接进入第八到十章,第二到五章可以稍后作为了解实现细节来讨论。偏向硬件的课程可以从第一到四章开始,然后跳过五、六章,直接进入其他剩下的章节。偏向编程语言的课程可以完成第一章后直接进入第五章,然后再回到第二到第四章,然后在第六章把所有内容结合到一起。第十章必须在使用本书开始课程前了解。
特别兴趣的技术人员可以自主决定他们阅读这本书的顺序,我们写这本书,力图使读者可以从感兴趣任何一章的开头开始阅读,并在阅读整章内容时只偶尔需要翻阅其他部分的内容。能完成这本书,我们要感谢许多人。我们要特别感谢许多审阅人,他们是IBM研究中心的Michael;菲利浦研究中心的Jan Hoogerbmgge;微软研究中心的Jim Larus;Sun微系统的Tim Lindholm、Bemd Mathiske;以及哈佛大学的Mike Smith。他们耐心地通读了全文,向我们反馈了许多有价值甚至是批评的非常有用的意见。我们也要感谢许多通读了特定章节的审阅人,给予本书有价值的洞察和评价。这些审阅人包括IBM研究中心的Erik Altman、Peter Capek、Evelyn Duesterwald和Michael Gschwind;佛罗里达大学的Renato Figueiredo;加州大学Irvine分校的Mi-chael Franz;明尼苏达大学的WeiHsu;UPC-Barcelona的Toni Juan;Intel的AlainKagi;Vmware 的Beng-Hong;马萨诸塞大学的EliotMoss;IBM Rochester研究中心的FrankSoltis;Intel的Rich-ard Uhlig;IBM Endicott研究中心的Romney White;普林斯顿大学的Wayne Wolf和微软研究中心的Ben Zom。我们很荣幸就虚拟机的各个方面与IBM的Vas Bala、Ek Ekanadham、Wolfram Sauer以及Charles Webb进行了讨论。
作者要感谢Sriram Vajapeyam在早期整理本书的资料时所做的贡献。威斯康辛大学麦迪逊分校和加泰罗尼亚理工大学Barcelona分校的学生们在学习虚拟机课程和开展虚拟机研究过程中提供了有价值的反馈意见。过去和现在对本书有过帮助的学生包括:Nidhi Aggarwal,Todd Be-zenek,Jason Cantin,Wooseok Chang,Ashutosh Dhodapkar,Timothy Heil,Shiliang Hu,Tejas Karkhanis,Ho-Seop Kim,Kyle Nesbit,和Subramanya Sastry,还有一些学生在此未能一一列出。
.本书的出版还包含了出版人Denise Penrose给予的指导,坚持不懈的努力和鼓励,以及她在
Morgan-Kaufmann出版社的优秀员工们的支持,他们包括Kimberlee Honjo,Angela Dooley,Aly-son Day,和Summer Block。
第一作者:我要感谢IBM研究中心的人,特别是Dan Prener,他们在我写作本书的初稿期间(2000~2001)给予了支持。特别感激Erik Altman,在我写作本书的过程中充当了宣传者。我还要感谢我的研究生们对本书的支持和所提出的有用的建议。最后,我要谢谢我的孩子们Barbara,Carolyn和Jim,在我写作本书的过程中他们给予了鼓励和付出的耐心,容忍经常心烦意乱的父亲。
第二作者:我要感谢DanPrener,Eric Kronstadt,和Jaime Moreno所给予的鼓励和支持。我还要感谢与Peter Capek,Dan Prener,Peter Oden,Dick Attanasio和Mark Mergen在茶歇时间里的讨论。最后,我要感谢我的妻子Indira,我的女儿Rohini和Nandini,她们自始至终给予我爱和理解。她们给予我的总是超乎我的想像。
两位作者互致感谢,我们能有机会重温延续了30多年的友谊。我们有着极为相同的兴趣爱好,在写这本书的过程中学到了许多东西。读者如果能够体验我们有过的经历中的一小部分,写作这本书就是值得的。
James E.Smith
Ravi Nair ...