从硬件的角度来看, 此时的 System/360 Model 67 并没有提供虚拟化设备的支持, 是 CP-67 虚拟机管理程序自己提供了所需的虚拟化. 然而 CP-67 并不能虚拟化主内存, 它还是需要 Model 67 的协助来完成.
尽管虚拟化在主机上是很成熟的技术, 我们最近还是经常听闻有关该技术的讨论. 早在 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 系统硬件上实现, 这种实现使得对上层操作是透明的.
来源: http://virtual.51cto.com/art/201806/576156.htm