尽管虚拟化在主机上是很成熟的技术,我们最近还是经常听闻有关该技术的讨论。早在1967年,CP-67虚拟机管理程序就已经支持虚拟机和虚拟化系统镜像。在这个虚拟机管理程序下,整个磁盘可以被虚拟为多个小型磁盘。例如像读卡器、打卡机和打印机等单元记录设备,甚至无需实际物理设备存在就能被虚拟出来。从硬件的角度来看,此时的System/360 Model 67并没有提供虚拟化设备的支持,是CP-67虚拟机管理程序自己提供了所需的虚拟化。然而CP-67并不能虚拟化主内存,它还是需要Model 67的协助来完成。
System/360 Model 67可以借助CP-67创建的表,来实施动态地址转换(DAT)。通过这种方式,虚拟机中一个特定内存块可以被映射到实际内存中的任意块。实际内存中非连续的内存块在虚拟机中可能就是连续的。更有趣的是,“虚拟内存”中的块有可能并不映射到实际内存中。相反,它会被CP-67映射到磁盘上的数据块,这个数据块只有在被引用时才读入真实的内存数据。这样的设计使得客户操作系统认为数据一直在内存中。这便所谓的分页技术,同时也是虚拟化技术的基础。今天的z/os系统正是利用这种机制隔离不同的应用和程序。
转译后备缓冲区(TLB)提供了实用性
动态地址转换是一个伟大的想法,但如果每次访问内存中指令或者操作数地址,都需要进行地址转换,那这个时间花费是不可接受的。大多数大型机的指令涉及多个地址,如果没有突破性的创新,动态地址转换反而会降低机器运行效率。这时出现了让动态地址转换依旧可用的创新,那就是转译后备缓冲区(TLB)。TLB是一种可以记录并快速访问前一次转译结果的结构。
在这里我们不会太深入讲解TLB的工程设计,但仍有几点需要留意。TLB是一个二维数组,其内容就是一系列的条目。如图1-01所示,它是长度为32个条目,宽度为4个条目的TLB。每个条目包含一个已被转译的虚拟地址和一个真实地址。使用索引和内容可寻址存储器,我们可以从TLB中获得正确的先前转译。如果先前转译并没有在TLB中,其它电子元件就会读取内存中的表并进行转换,然后将结果写入到TLB的相应列中,以备后续使用。
使用大型的TLB是非常有用的,这样就能最小化内存中表的访问。然而不幸的是,大型电子电路的速度访问会非常缓慢,因为信号必须在更大的结构中传播更远的距离。此外,内容寻址存储器所需的电路数增长是非线性的。所以TLB一般来说都比较小。幸运的是我们已经有一些技术可以提升有效容量,因此无需使用很大的TLB。
图1-01 一级TLB
***化TLB的容量
起初,单一的TLB可用于转译指令地址和操作数地址。但同时也有两个地方需要转译,那就是指令提取逻辑和操作数访问逻辑。一个能有效增加容量的方法是使用两套TLB,一个用于处理指令地址,另一个用于处理操作数地址。处理指令的TLB一般物理位置上临近指令存取逻辑,处理数据的则被放置在操作数地址逻辑附近。即使这样的设计需要额外逻辑来维护这两个TLB的交互,但这个额外花销是值得的,因为它带来了效率的提升。
另外可做的是增加TLB的层级,这些额外增加的层级可以是大容量和低速度的设备,因为它们仅会在小型高速TLB未***时使用。这种添加层级的方法已被用于处理器高速缓存几十年了。每个次级层次都容量更大,同时需要更多的周期来访问。为此IBM工程师用非线性的方式实现了二级转译后备缓冲区(TLB2)。在内存中的DAT表并不再是线性表,而是更复杂的多层结构(如图2-01所示)。例如在双层表中,***级表称为段表,它包含内存映射到二级表的入口;二级表称为页面表,它包含256个用于映射4K内存的条目。
图2-01 存储中的DAT表结构
现代的z系统处理器的TLB2有两种类型的条目(如图2-02所示),大小为1MB的段和大小为4K的页。当转译在***层TLB(TLB1)中找不到时,TLB2就会搜索4KB页条目所提供的转译。如果没有找到,TLB2就会在段条目中搜索包含待转译的地址。如果这个条目被找到,就不会再使用内存中表的转译,因为对应的页表可以直接被访问,而无需访问存储器中的段表。因此如使用TLB2,额外的转译可以通过访问内存中的表来实现,至少减少了这些访问的次数。
图2-02 二级TLB的结构
增加TLB有效容量的另一种方法是支持更大的页面,使得仅需要较少的条目就能覆盖给定的虚拟地址。在z系统的处理器中,这个特性得到了支持。首先在Z10的处理器上,TLB1会继续支持4KB的条目,但TLB2可以容纳1MB的页条目。这些1MB的页条目可以无需访问内存中的表来创建TLB1所需的4KB条目。在z196处理器中,TLB1已经可以支持1MB的页条目。在这个处理器中,添加了特殊的数据TLB1用于1MB页条目的处理,同时指令TLB1也被增强用于支持4KB和1MB两个页条目。在zEC12还引入了2GB页条目的支持。在这种结构下,有一个小型的数据TLB1持有一些2GB的页条目,而一些非常大的页条目被用作DB2缓冲区域和JAVA堆的有效映射。
虚拟化的创新还在继续
本文的简介并没有谈到z/VM虚拟机支持客户机的虚拟内存。为了实现这种功能,z系统的处理器支持两层的转译。首先,客户机的虚拟地址被转译成客户机的实际地址。但是客户机的真实地址是主机端的虚拟地址,它需要转译成主机的真实地址。在这里我们不会就本话题做进一步探讨,仅仅有一点提醒大家注意,那便是两层转译涉及到许多表的访问,因为客户表的转译还涉及到额外的主机转译。还有许多更复杂的操作在z系统硬件上实现,这种实现使得对上层操作是透明的。