PlayStation 3 硬件架构

Rodrigo Copetti 的实用分析

这是原文的志愿翻译。如果您发现任何错误,请帮助改进。谢谢!

如果您使用无障碍阅读工具、电子书或旧版浏览器,切换到“经典”版




相关影像

型号

Image
初代 PlayStation 3 或“PS3”。
2006年11月11日于日本发售,2006年11月17日于美国发售,2007年3月23日于欧洲发售。
Image
PS3 2000/3000 系列( “Slim”)。
在2009年9月1日在欧洲和美国发售,2009年9月3日于日本发售。
Image
PS3 4000系列( “Super Slim”)。
2012年9月份在全球发售

主板

Image
主板
COK-001 版本(初版),来自我的 CECHA12 。
128MB NAND 闪存、Blu-ray PATA 光驱的接口、Wi-Fi/BT子板,前面板和多功能读卡器在背面。
Image
带有重要部件标签的主板

图示

Image
主架构图

快速入门

2006 年,索尼推出了瞩目已久的次时代游戏主机—— PlayStation 2。这颗璀璨的新星继承了上一代 Emotion Engine 的特点,以复杂度为代价,专注于矢量处理以求更高性能。 同时,面对创新危机和多媒体服务趋势的演变,他们构思出了全新的“超级处理器”——Cell。

本文将深度审视这个由 Sony、IBM、东芝 和 NVIDIA 合作的项目和它开发的过程,并且会讨论它对于整个业界的影响。

关于文章长度

抱歉,这篇文章并不是本系列文章中常见的“午饭时间”文章。 如果你对 PlayStation 3 的所有方面都感兴趣,那你就要全程参与了! 尽管如此,这篇文章包含了无数工程师长达 6 年的研发成果,所以我并不指望你能一下子消化完。 请花时间好好阅读(当然必要时还是要休息),如果你读完了还觉得不过瘾,那请自行查阅“来源”部分!


中央处理器 (CPU)

欢迎来到这台主机上最知名也是最创新的部件。

简介

PS3 的 CPU 极其复杂,同时也是一项非常迷人的工程杰作,它将复杂的需求和不寻常的解决方案结合在一起,在那个变革与实验的时代显得尤为突出。 所以,在我们步入 PS3 CPU 的内部之前,让我们先了解一些历史背景。 这样一来,我们就能从上到下地解构这颗芯片,不仅让你了解它的工作原理,还能明白主要设计决策背后的原因。

背景

Image
PS1的CPU(1994)。 由索尼和LSI设计,使用MIPS技术
Image
PS2的EE(Emotion Engine)(2001)。 由东芝设计,再一次使用MIPS技术

初代 MIPS 架构的 PlayStation推出近十年后,我们来到了21世纪初,而此时 SGI/MIPS 的情况并不乐观。 任天堂在那时刚刚抛弃他们,转而选择IBM作为新的供应商,使用了一款低端的 PowerPC 核心;新入局的微软则选择了 Intel和他们的 x86 帝国。

索尼一直在改造现有的廉价 MIPS 核心,在降低成本的同时实现可接受的3D性能,这一流程同时涉及到 LSI(负责了 PS1 的 CPU)和东芝(负责了 PS2 的 Emotion Engine)这样的公司。 这个方法一直延续到 2004 年 PlayStation Portable 的发布。 所以,他们将会为 PlayStation 3 构造出什么样的 MIPS 混合体呢?

事实上,PlayStation 3 的开发早于 PlayStation Portable [1]。 在 2000 年,PS2 发布几个月之后,Sony 就和 IBM 与东芝的成立了名为 “STI” 的联盟,其唯一的目标就是研发下一代超级计算机的芯片 [2]。 听上去可能不够奢侈,但这枚芯片将会被用在 PS2 的继任者上。 最终,IBM 在2004年揭晓了这枚 Cell Broadband Engine(也被称为 ”Cell BE“ 或者直接就叫 “Cell”)[3]

新的设计哲学

Image
CBE(Cell Broadband Engine,Cell宽带引擎)芯片 可惜我的相机拍不好。太亮了

为了理解 Cell 的_激进之处_,我们必须先深入了解当时(90 年代晚期 - 00 年代早期)困扰业界的几个问题。

消费者每年都在要求更快的速度, 一直如此。 但是,过去拉长流水线并提升主频的方案遇到了瓶颈。 Intel 的 NetBurst 架构进化到了极限,他们承诺的继任者也不见踪影。 同时,IBM 的 PowerPC 970/G5 也不能达成他们的 “3 GHz” 或是低功耗 CPU的承诺,也因此 Apple 没有发布搭载 IBM 最新一代的 CPU 的笔记本[4]。 总而言之,看起来工程师们遇到了一个新的升级危机

因此,焦点转向了分布式计算[5]。 换句话来说,提升单个机器性能遇到的困境,是不是能够通过让多个小机器分担来解决呢? 这个方案并不新鲜,细数我们分析过的所有主机,它们都包含了不止一个处理器。 然而,“多核心的单处理器”的出现为不限于主机的 CPU 设计指明了新的方向。

而 Cell,则正好是这波新研发浪潮的一部分。 这枚新 CPU 结合了一个对向量处理有特殊照顾的多核设计。 如果读者还记得的话,向量计算非常适合模拟运算(如物理、光照等),并且之前已经以几何变换引擎(Geometry Transformation Engine)向量单元(Vector Units)的形式出现过。但很快你就会明白,Cell 的设计相较于两者有多大的进步。

新的多核纪元

Image
异构设计示例。
迄今为止,这是许多功能强大的游戏机的事实上的架构
Image
同构设计示例。
每个内核都可以执行与之前相同的任务,但不必局限于这些任务

如果你停下来思考一下,就会发现 PS1 的 CPU 和 Emotion Engine 已经是多核处理器了。 那为何 Cell 搞的如此大张旗鼓呢? 之前两代芯片是由单个通用核心加上多个专用于音频处理器和图像解压缩处理器等功能的核心组成,它们混合了多种不同架构,其中通用核心负责指挥其他核心的工作。

这种 CPU 设计被称为异构计算,它一直是构建专门用于游戏或其他特定应用集计算机的事实标准。 与之相对应的同构计算在 PC 市场上更有优势,因为 PC 市场上的 CPU 需要支持各种相同的优先级的任务。 因此采用同构设计的CPU会包含多个同一类型的核心。

回到我们的主题上,Cell 整合了两种类型:它有两种类型的核心,一个通用的“领导者”和八个向量“助手”。 这些向量核心可以担任多种角色,解决需要使用异构计算处理的任务,且由于 Cell 的向量处理器并不局限于单一任务,这些核心提供了同构计算的灵活度。 总的来说,这种设计并不完美,而且会继承某些妥协点,但下文会让读者看到 Cell 如何解决不同的问题。

Cell 速览

解释完所有历史和理论之后,我认为我们已经准备好去回头看到这节的主人公。 这是Cell:

Image
Cell宽带引擎(Cell Broadband Engine)(PS3的变体)
IBM为超算和科研模拟设计。 划线的“SPE”表示禁用(不可用)。 左边的另一个“SPE”保留给操作系统使用。

……到这节的末尾时,读者将了解到每个组件的用途。

架构全览

Cell 运行在_超高的_ 3.2 GHz ,且由很多组件构成。 为了文章分析清晰起见,我们将它分为三个主要区域[6]

后续的内容会深入解析这些概念,所以读者并不需要记住这些名字。 本节的主要目的是让读者对 Cell 有一个大致的印象并熟悉一下所有我们将要讨论的组件。

我们如何进行研究

我们来梳理一下先前的架构,以防读者过载。 我们会以如下的顺序对每个组件进行研究:

  1. 用来连接各个组件的元件互联总线(EIB)。
  2. PowerPC处理元件(PPE)和它的核心PowerPC处理单元(PowerPC Processing Unit,简称PPU)。
  3. 主机可用的通用内存
  4. 协同处理元件(SPE)和它的核心协同处理元件(Synergistic Processing Unit,简称SPU)。
  5. 在 Cell 上高效编程的编程模型

闲话少说,让我们开始实际分析。

Cell的内部:心脏

Cell 自发布以来一直被称为片上网络(NoC)而不是传统的片上系统(SoC)[7] ,这主要归结于 Cell 的非正统数据总线:元件互联总线(EIB)。 截至目前我们已经看到了CPU组件对内存的需求有多高一个系统对瓶颈能有多敏感。 为了解决这个麻烦问题,IBM这次换用了新的设计……并用类似于_道路驾驶_的术语撰写了文档。

Image
元件互连总线 (Element Interconnect Bus,EIB) 的简化图。
“坡道”(节点)之间的每个箭头代表两条单向总线,因此每个节点通过四个通道与下一个节点相连。

EIB 有 12 个被称为坡道(Ramp)的节点,每个节点都连接着一个 Cell 组件。 这些坡道通过四组总线内联,其中两组数据方向为顺时针,另外两组则是逆时针。 每一组总线(或者叫车道)有128位宽。 不同于单总线的拓扑结构(类似于 Emotion Engine 及其前身),坡道采用令牌环网的方式互联,这种结构中的数据包在到达目的地前需要通过路径上的所有邻居,没有直接路径。 因为 EIB 提供了四个通道,所以它有四条可能的路径(环路)。

读者可能会有疑问,相较于单总线结构,数据在令牌环拓扑结构中需要走更长的距离,那使用它的理由何在? 这主要原因是单总线非常容易阻塞。 因此 EIB 的工程师决定采用这种结构来应对大量并发流量,后续内容会详细介绍令牌环的作用。

数据被打包成128位的数据包进行传输[8]。 在数据包没有重叠的情况下,每个环可以承载三组并发传输。 EIB 以命令信用(command credits)模式工作,具体来说,每当一个组件需要发起传输时,它就会给 EIB 里用于管理环内流量的仲裁者(Data Arbiter)发送一个请求。 当这个请求被批准的时候,数据包就会进入环内,同时收到一个带有元数据,可以让仲裁者来管理传输的“令牌”。 另外,部分组件,比如用于访问主内存的 MIC(Memory Interface Controller)会拥有比其他组件更高的优先级。 最后,仲裁者不会将路径长于半个环的数据包置入环内。

每个坡道都会参与传输,它们通过读取数据包目的地址来获知是否要将这个包的数据提供给自己连接的组件,还是要将它转发到下一个坡道。 在每个时钟周期内,坡道可以同时接收和发送128位(16 字节)的数据包。 所以,考虑到共有四个通道且 EIB工作在 1.6 GHz 上 (Cell 频率的一半),它的理论最大传输速率为 16 字节 x 2 次传输/时钟周期 x 4 通道 x 1.6 GHz = 204.8GB/s,当然,这个值高估了实际速度,因为还有很多额外的因素会影响到性能,例如从出发地到目的地的路径、总线的状态等等。 另外 IBM 和其他作者发表了很多论文,用实际的实验来推算更准确的传输速度[9]

现在,读者已经了解 Cell 是如何连接各个组件的,是时候好好看看这枚芯片的第一个组件了……

Cell的内部:领导者

我们来看看 Cell 的“主要部分”。 这是芯片上负责命令剩余部分的组件。 它的名字是 PowerPC 处理元件(PPE),你可以把视作 Emotion Engine 上的 MIPS R5900。

PPE 的结构

还记得之前我把 Cell 拆分成了几个不同的区域吗? 我们同样可以对 PPE 这么干。 IBM 使用“元件”(element)这个词来形容这个独立的机器[10],但在内部,我们需要使用“单元”(unit)这个词来区别开和 Cell 其他部分做通信的接口芯片区域。

Image
PowerPC处理元件 (PPE) 简化图。

在这个前提下,PPE _惊讶地_由两个部分构成:

如你所见,PPE 和 Cell 的其他部分的设计是相当模块化的,这应用了 RISC 的设计经验,PPU 内部也应用了模块化思想。

PowerPC 处理单元

现在我们深入到 PPU 的内部。 但先回顾一下,我们已经深入 Cell 内部,然后是 PPE 的内部,现在到了 PPU 的内部。 我们将像分析其他 CPU 那样分析 PPU。

熟悉的架构

首先,PPU 部分不是全新的,而是现有 PowerPC 技术的重新利用。 但是不同于前几代主机上 IBM 直接拿现有处理器做小幅升级来满足新需求的做法,PPE 没有基于现有的 CPU 设计。 相反,IBM 根据 2.02 版的 PowerPC 规范 (更名为“Power 指令集”前的最后一个 PowerPC 规范版本)构建了一个新的 CPU。 总之,尽管它的机器码和其他 PowerPC 芯片一样,但当时市面上并没有与 PPU 一样的设计。

那么,为什么 IBM 选择了 PowerPC 来开发高性能芯片呢? 在当时,PowerPC 是一个经过 Macintosh 用户测试和迭代了约10年的成熟平台[11],它能够满足Sony所有的需求,且适应不同的环境。 同时,使用常用架构可以复用现有的编译器和代码库,这对于一台新主机来说是巨大的起步优势。

值得一提的是,IBM 其实是第一枚 PowerPC 芯片的共同开发者之一,另外两个是 Motorola 和 Apple(也就是AIM 联盟)。 但是在00年代初期的时候,所谓的联盟已经分崩离析,当时 Motorola/Freescale 开发了与 IBM 所不同的 PowerPC 系列。

独特功能

PPU 和 PowerPC 970(Apple 称之为_ G5_) 有一些历史渊源,两者都是 POWER4 的后代,POWER4 作为 PowerPC 前身主要用于工作站和超级计算机。 稍后的模块化执行单元会更明显地展示这点。 它相较于 GameCube 上的 750 系列 CPU有着根本性的变化,后者主要归功于 Motorola ,IBM 只是做了小幅改动。

回到主题,PPU 是一个完整的64位处理器。 这意味着:

  • 一个字长为64位
  • 它有32个64位通用寄存器
  • 数据总线宽度_至少_为64位:在本文的下一章节,你会看到它实际上比这宽很多,但就现在而言,请记住传输64位数据并不会影响性能
  • 64位地址总线:理论上,CPU可以访问多达16 EB 内存。 在实践中,如果机器并没有这么多内存,这样做会有很大的代价。 因此,现代 CPU 通过将地址翻译的任务分配给内存管理单元 (MMU) 来提高对地址总线的利用

最后,PPU 实现了 2.02 版 PowerPC 指令集,包括可选的浮点平方根操作码 [12]。 它还扩展了一组名为向量/单指令多数据流多媒体扩展(Vector/SIMD Multimedia Extension,简称 VMX)的SIMD指令。 但 PPU 同样缺少了一些原版规范的内容,比如小端模式以及少数几个操作码,实际上,Cell只支持大端模式。

PPU的基础元件

透过“微观视图”,我们能观察到PPU这个单元由不同的模块或子单元组成,它们执行独立的操作(从内存中加载值、执行算术运算等)。 PPU的能力由各个模块的能力来决定:

指令
Image
指令单元(IU)的简化图

头一个模块被称为指令单元(IU),顾名思义,它从L2缓存中提取指令,并向其他单元发出信号以执行所需的操作。 正如同时代的i686指令集,一部分指令集会被微码(指令单元为此用途集成了一小片ROM)做进一步解释。 最后,指令单元还包含了32KB的L1指令缓存

指令经过一个12级流水线发射,不过在实际中,总流水线数会根据指令类型存在比较大的变化。 例如,分支预测单元将会跳过绝大部分。 如果将指令单元和邻近的单元组合起来,总的流水线级数接近24级(对,这是个很大的数字,但请记住Cell跑在3.2GHz)。

比较有意思的是,指令单元是双发射的:在一些情况下,指令单元可以同时发射最多两个指令,这将大大提升吞吐量。 不过在实际中,双发射需要比较多的条件才能触发,所以程序员/编译器将负责优化程序以便他们的指令队列可以利用到这个功能。 顺带一提,双发射在以前的CPU上已经被实现了,当然,它在不同CPU供应商那儿的定义不一样,这里我使用了IBM的定义。

此外最重要的是,指令单元是多线程的,意思是它可以同时执行两个不同的指令队列(叫做“线程”)。 背后机制就是指令单元在单个周期内于两条线程之间切换,呈现出了多线程的效果。 这项技术之前被称为“同步多线程(SMT)”,或后来Intel创造的名词_超线程_。 不过,IBM的多线程技术还是减轻了它带来的诸如流水线冒泡的不良影响,因为CPU不会因为一条指令的阻塞而被迫停顿。 为了实现多线程,IBM的工程师复制了指令单元的内部资源,其中包括通用寄存器(之前我说过有32个可用的寄存器,那只是单个线程的。 实际上,它一共有64个!),不过在PowerPC规范之外的资源(诸如L1和L2缓存;还有接口),仍然是共享的。 因此,后者仍然是单线程的。

总的来说,将双发射和双线程整合在一起,PPU可以在单个周期内执行多达4个指令。 即便这只是一个“最佳场景”,但它确实提供了优化的机会,用户最终会在游戏帧率上注意到!

内存管理
Image
存-取单元(LSU)和它的邻居的简化图

以下模块赋予PPU执行存-取指令和内存管理的能力。

首先,访存单元(LSU)执行“读取”和“存储”这两个由32KB L1缓存提供的opcode。 因此,这个单元有权直接访问内存和寄存器。

此外,LSU与内存管理单元(MMU)耦合,这在当今硬件中很常见。 长话短说,MMU通过一个结合了内存保护虚拟地址映射表处理地址翻译。 为了改善后者,该MMU特别配备了一个段单元,它使用称为“段”的范围对内存地址进行分组。 现在,为了防止在此过程中出现性能下降,还包括一个转译后备缓冲区(TLB)(缓存转换后的地址)和一个段后备缓冲区(SLB)(缓存段)。

算术
Image
运算单元简化图

PPU还有两个单元需要说明,它们是计算游戏所需的数学运算单元。

第一个是传统的定点整数单元(Fixed-Point Integer Unit,FXU)。 它执行整数运算,如除法、乘法、位旋转(与位移类似,但丢弃的位会返回到另一端)和前导置零(例如,对顶点坐标进行归一化时非常有用)。 它的流水线长达11级。

从图中可以看出,FXU、LSU和MMU被归为一个单元,称为执行单元(Execution Unit,XU),这是因为它们共享同一个寄存器文件。

第二个单元更有意思,它是矢量/标量单元(Vector/Scalar Unit,VSU),用于执行浮点数和矢量操作。 它由一个64 位FPU(遵循IEEE 754标准)和一个矢量/SIMD多媒体扩展单元(Vector/SIMD Multimedia Extension unit,VXU)组成,后者执行一组名为_VMX_的SIMD指令。 VMX可执行128位矢量(从16个8位数值到4个32位数值)[13]。 你可能以前听说过这种扩展,因为“VMX”是IBM对摩托罗拉“AltiVec”或苹果 “Velocity Engine”的称呼(商标万岁)。 相反,Cell的竞争性SIMD功能是在另一种处理器上实现的,所以现在还不要放松警惕!

包装PPE

您刚刚看到了PPE的工作原理和构成,但它对开发人员意味着什么呢?

毕竟,PowerPC处理元件只是一个通用处理器,但问题是:它并不是单独工作的。 还记得宽主总线(EIB)吗? IBM设计PPE的目的是让工程师将它与其他处理器结合起来,以加速特定的应用(如 HPC、3D图形、安全、科学模拟、网络、视频处理等),由于本文是关于 PlayStation3的,你会发现Cell的其他部分都是以计算机图形和物理为中心的,因此,本文的其他部分也反映了这一目的。

Cell之外:主内存

现在让我们暂时跳出Cell,因为如果没有适当的工作空间(内存)来让它工作,PPE再好也没有用。

因此,索尼在主板上安装了256 MB XDR DRAM… …但是,_这又意味着什么呢?_要回答这个问题,我们需要了解内存块的工作原理以及它们与Cell的连接方式。

Image
Cell旁边是四个64 MB XDR DRAM芯片。

首先,所配备的内存类型被称为极限数据速率(Extreme Data Rate,XDR)。 你可能会认为XDR DRAM是任天堂64PlayStation 2中的_倒霉的_RDRAM的后继者。 但先别急着下结论!

Rambus和其他公司一样,也会对自己的发明进行改进。 他们的第三次修订版(XDR)现在可以八倍速率运行(是对手 DDR DRAM 的四倍)[14]。 延迟不再是个问题,如果我们看一下制造商的数据表,XDR的延迟在28ns到36ns之间[15],几乎比第一代RDRAM芯片快10倍

PlayStation 3的第一版主板包含四个64 MB芯片,成对使用。 XDR通过两条32位总线与Cell相连,每对总线上有一个。 因此,每当PPU写入一个字(64位数据)时,就会在两个XDR芯片之间进行分配。 后者的时钟频率为400 MHz[16]

Image
Cell 的内存架构图

Cell通过内存接口控制器(Memory Interface Controller,MIC)与XDR芯片连接,MIC是Cell 的另一个组件(与PPE类似)。 此外,MIC还能对内存传输进行缓冲,以提高带宽,但它有一个很大的限制:大字节对齐。 从本质上讲,MIC传输的最小数据大小为128字节,这对于顺序读取或写入非常有效。 但如果数据小于128字节,或者需要交替写入和读取,性能就会受到影响。

也就是说,MIC是瓶颈,或是加速器? 你必须正确看待这个问题,带宽优化在数据饥渴型系统中至关重要。 在过去,我们已经见过写入收集管道回写缓冲区等解决方案,因此MIC只是针对一个反复出现的问题提出的新建议。 索尼宣称其传输速率为25.6 GB/s,但实际上,最终的传输速率取决于太多因素(你已经看到在Cell内将数据从一个地方移动到另一个地方是多么复杂)。

主内存就到此为止,但其他地方还有更多内存:硬盘。 PS3还允许游戏使用内部硬盘中的2 GB作为工作区(与初代Xbox提供的功能类似)[17]

Cell内部:助手们

我们已经看到,索尼公司总是在提供通用处理器(本例中为PPE)的同时提供加速器,以达到可接受的游戏性能(PS2为VPU和IPU;PS1为GTE和MDEC)。 这是游戏机硬件的常见做法,因为通用型可以执行各种任务,但并不专精于任何方面。 游戏机只需要一个子集的技能(例如物理、图形和音频),因此协处理器能使它们完成任务。

[PPE]是为了降低功耗而精简的版本。 因此,它并不具备奔腾4所具备的马力(……)。 如果你把今天在英特尔或AMD(不管你的处理器是什么)上运行的代码拿到Cell上重新编译,它今天就能运行——也许你得改一两个库,但今天就能在这里运行,没问题。 但速度会慢60%甚至50%,所以人们会说:“OMG! 这个Cell处理器太废物了!” 但那是因为你只用了那一块部分(PPE)[18]

——IBM TJ沃森研究中心 Cell解决方案部经理 Michael Perrone博士

PS3 的 Cell 中包含的加速器是协同处理器元件(Synergistic Processor Element,SPE)。 Cell包括8个SPE,但其中一个在游戏机启动时被禁用。 这是因为芯片制造需要极高的精度(Cell最初使用的是90nm制造工艺),而机器并不完美。 因此,Cell并没有丢弃缺陷率小于10%的电路,而是加入了一个备用SPE。 这样,如果其中一个出现缺陷,整个芯片就不会被丢弃。 现在,备用SPE将始终处于停用状态,无论它是否正常(索尼不可能在市场上有两种不同的PS3)。

协同处理器元件的组成

继续往下看,协同处理器元件(SPE)是Cell内部的一台独立小计算机,由PPE指挥。 还记得我之前解释过的关于采用同构计算元件的问题吗? 这些协处理器具有一定的通用性,并不局限于单一应用,因此只要开发人员能正确编程,它们就能协助完成各种任务。

Image
协同处理器元件(SPE)简图,Cell内有八个这样的元件(其中一个已禁用)。

就像我们在PPE上所做的那样,我们来看看SPE。 由于篇幅较短,如果您想了解更多有关 SPE 的信息,请查看文章末尾的“资料来源”部分。 既然如此,让我们开始吧……

SPE是一种与PPE结构类似的处理器,由两部分组成:

内存流控制器

内存流控制器(Memory Flow Controller,MFC)是将内核与Cell其他部分互连起来的模块,相当于PPE中的PowerPC处理器存储子系统(PowerPC Processor Storage Subsystem,PPSS)。 MFC的主要任务是在SPU的本地内存和Cell的主内存之间移动数据,并保持SPU与其相邻内存同步。

为了履行职责,MFC内嵌了一个DMA控制器,用于处理EIB与SPU本地存储器之间的通信。 此外,MFC还包含另一个名为协同总线接口(SBI)的组件,它位于EIB总线和DMA控制器之间。 虽然这是一个非常复杂的电路,但它基本上可以解释从外部接收到的命令和数据,并向SPE的内部单元发出信号。 作为Cell的 “前门”,SBI有两种工作模式:总线主控模式(SPE可从外部请求数据)或总线从属模式(SPE可从外部接收指令)。

一个奇怪的事实是,考虑到EIB数据包的限制(最长128位),MFC的直接内存访问块每个周期最多只能移动16 KB的数据,否则,EIB会在执行过程中抛出“总线错误”异常[19]

协同处理器单元

协同处理器单元(Synergistic Processor Unit,SPU)是SPE中核心处理器所在的部分,相当于我们所说的PPE中的“PPU”。

与PPU不同,SPU与Cell的其他部分是隔离的。 因此,PPU和其他SPU之间没有共享内存。 相反,SPU包含用作工作空间的本地内存。 不过,本地内存的内容可以通过MFC来回移动。

就功能而言,SPU比PPU受到更多限制。 例如,SPU不包括任何内存管理功能(地址转换和内存保护),甚至不包括最先进的功能(即动态分支预测)。 尽管如此,它在矢量处理方面却表现出色。

在对该单元进行编程时,开发人员使用PPU调用PlayStation 3操作系统提供的例程,这些例程将专门为SPU编写的可执行文件上传到所选的SPU,并向其发出开始执行的信号。 之后,PPU会保留SPU线程的引用,以实现同步[20]

SPU的结构

与其他CPU一样,协同处理器单元(SPU)也使用指令集架构(ISA)进行编程。 SPU和PPU都采用RISC方法,但SPU的ISA与PPU不同(PPU采用PowerPC ISA),它是专有的,主要由SIMD类型的指令集组成。 因此,SPU具有128个128位通用寄存器,可容纳由32/16位定点或浮点数值组成的向量。 另一方面,为了保护内存,SPU 指令的长度更短,只有32 位。 第一部分包含操作码,其余部分最多可以引用三个操作数进行并行计算。

这与之前在PS2上首次亮相的矢量浮点运算单元非常相似,但从那时起已经发生了很大变化。 例如,SPU不需要开发人员学习新的专用汇编语言——IBM和索尼提供的工具包可以使用C++、C或汇编语言对SPU进行编程。

在设计方面,这款处理器并不使用同一个单元来执行所有指令,而是将指令的执行分为两个区块或“执行流水线”,一个称为奇数流水线,另一个称为偶数流水线。 这两条流水线执行不同类型的指令,使SPU在可能的情况下每个周期发出两条指令。 另一方面,SPU绝不会同时发布相互依赖的指令,从而减少可能出现的数据冒险

现在让我们来看看这两条流水线[21]

奇数流水线
Image
奇数流水线简图

奇数流水线执行除算术指令外的大部分指令。

首先,你会发现SPU存/取单元 (SLS) 有三个基本功能:

  • 容纳256 KB本地内存,用于存储指令和数据。 采用的内存类型是单端口(考虑到这是一个关键区域,他们没有使用双端口芯片有点令人失望……)。 此外,地址总线长32位。
  • 执行加载和存储指令。
  • 将指令转发到另一个区块以发出指令。

注意只有256 KB可用来存储程序。 考虑到SPU程序可以使用C/C++编译,要预测二进制文件的大小并不容易。 因此,建议开发人员假定只有一半的可用内存(128 KB)[22],这就为编译后的代码留出了足够的空间,使其可以根据需要占用尽可能多的空间,但这是以牺牲存储空间和效率为代价的。

最后,还有一个SPU通道和DMA传输(SSC)单元,内存流控制器利用它来填充和/或获取本地内存,以及一个_微不足道_的定点单元,它只能进行数据重排(shuffling)和矢量旋转。

偶数流水线
Image
偶数流水线简图

偶数流水线的显著特点是其算术功能。

这里有一个_真正的_定点单元(FXU),可执行基本算术、逻辑运算(与、或等)和字移位。

最后是浮点运算单元(FPU),可执行单精度(32位float)、双精度(64位double)和整数(32位int)运算。 它遵循IEEE标准,但有一些偏差(浮点运算行为与PS2类似)。

Cell内部:编程风格

当我们到达Cell的尽头时,你可能会问,开发人员该如何为这个_怪物_编程呢? 与之前为EE设计的编程模式类似,IBM提出了以下方法[23]

以PPE为中心的方法

Image
多阶段模式的示意图,其中PPE分配一个任务,该任务在每个SPE之间传递,并最终与处理过的数据一起返回。
Image
并行模式的表现形式,即PPE为每个SPE分配一个子任务,然后每个SPE返回处理过的数据,PPE再将其合并。
Image
服务模式展示图:PPE为每个SPE分配不同的任务,每个SPE单独完成任务。

以PPE为中心的方法是一套编程模式,它将主要责任放在PPE上,让SPE来卸载工作。 有三种可能的模式:

以SPE为中心的方法

Image
以SPE为中心的模式的示意图,即每个SPE负责自己的功能,只在获取资源时与PPE交互。

这与使用SPE为PPE服务的方式正好相反。 利用内部DMA单元,SPE获取并执行存储在主内存中的任务,而PPE则仅限于资源管理。

这种模式比其他模式要激进得多,因为以前的模式更接近于传统的、类似于PC的“带协处理器的通用处理器”模式。 因此,实施以SPE为中心的算法的代码库可能较难移植到其他平台。

结论

可以想象,虽然Cell的多核设计可以加速过程生成等新兴技术,但这些设计的实现都不是特别简单,尤其是考虑到游戏工作室更喜欢可以在不同平台上共享的代码库。

举个例子,虚幻3引擎 的开发商(Epic Games)在尝试实现其碰撞检测系统时,就证明了SPU的局限性[24]。 他们的设计依赖于二叉空间分割(Binary Space Partitioning,BSP),这是一种非常依赖于比较(分支)的算法。 由于SPU无法像PPU那样提供动态分支预测,因此在与其他平台(即Xbox 360i686 PC,这两种平台的所有内核都提供一致的预测技术)横向对比时,他们的实现让PlayStation 3用户感到失望。 因此,Epic Games不得不采用仅与Cell兼容的进一步优化手段。

我想,对于软件工程师来说,要想充分发挥Cell的潜力,需要的只是时间、耐心和大量的学习。 然而,历史证明,这并不是每个工作室都能做到的,这让我不禁怀疑,这是否就是当前游戏机硬件(截至2021年)同质化如此严重的原因。


图形

如果你认为拥有各种怪异功能的Cell可以胜任这款游戏机的所有任务,那么让我告诉你一件令人歇斯底里的事情:索尼为3D图形安装了一个独立的芯片

Image
神秘海域3:德雷克的欺骗(Uncharted 3: Drake’s Deception)(2011)
Image
上古卷轴5:天际(The Elder Scrolls V: Skyrim)(2011)
Image
杀戮地带3(Killzone 3)(2011)
Image
海贼无双(One Piece: Pirate Warriors)(2012)
PS3游戏的例子。 它们全部以最大分辨率(1280x720像素)呈现。

看来,即使有了超级计算机芯片,索尼公司仍然需要一个GPU来完成PlayStation 3的开发。 这不禁让人怀疑,IBM/索尼/东芝是否在试图进一步扩展Cell的过程中碰了壁,所以索尼别无选择,只能寻求图形公司的帮助。

我们成立了 ICE[Initiative For A Common Engine,通用引擎倡议]团队,目的是开发一些核心技术,供所有第一方共享(……) 有一段时间,[PS3]没有GPU,它将使用SPU运行一切。 ICE团队向日本证明,这是不可能的。 这太荒谬了。 从性能上讲,这将是一场灾难。 这就是为什么他们最终在接近尾声时加入了GPU[25].。

——来自顽皮狗的匿名消息来源

我可以肯定的是,PS3包含一个由英伟达制造的GPU芯片,用于卸载部分图形流水线。 该芯片名为现实合成器(Reality Synthesizer,“RSX”),运行频率为500 MHz[26]。 与Cell的时钟频率(3.2 GHz)相比,RSX的时钟频率显得有些令人担忧,不过你很快就会发现GPU更适合并行计算大量操作。 因此,在构建图形管线时,我们需要在Cell和RSX之间找到一个平衡点(不过我必须承认,这在纸面上听起来要比实际操作简单得多)。

现在,我将对Cell进行与之前相同程度的分析,这次将重点关注RSX及其图形功能.

概述

自2001年英伟达首次推出GeForce3/NV30系列产品以来,已经过去了5年时间,当时的竞技场上已经出现了3dfx、S3和ArtX/ATI等强手。 尽管在随后的几年里,这些公司的数量慢慢减少,到2006 年,PC市场上的旗舰显卡供应商只剩下ATI和英伟达。

Image
靠近Cell的RSX芯片

RSX继承了英伟达现有的技术,据说它基于面向PC销售的7800 GTX型号,该型号实现了GeForce7(或NV47)架构[27],也被命名为“Curie”。

在我之前的Xbox分析中,我谈到了GeForce3及其首次推出的像素着色器,那么从那时起发生了什么变化呢? 虽然有一些起伏,但大部分都是渐进式变化,因此与GeForce3的像素着色器相比,没有什么突破性的变化。

另一方面,7800 GTX依靠PCI Express协议与CPU通信,而RSX则经过改造,使用名为Flex I/O[28]的专有协议。 Flex I/O有两种工作模式:

唉,RSX不是Cell,所以要通过IOIF协议,使用最快的插槽。

为了便于比较,IOIF是32位并行总线,理论带宽高达20 GB/s,而7800 GTX使用的PCI Express(x16 1.0)是16位串行总线,理论带宽高达4 GB/s。

硬件组织

RSX拥有256 MB专用GDDR3 SDRAM。 令人惊讶的是,它与Wii的内存类型相同。 内存总线运行频率为650 MHz,理论带宽高达20.8 GB/s

Image
数据如何在可用内存中进行编排的例子. 请注意RSX如何从不同的内存芯片访问其内容。

在这256 MB内,Cell可以放置RSX渲染一帧所需的所有内容。 其中包括顶点数据、着色器、纹理和命令。 现在,得益于Cell的Flex I/O总线,RSX还可以利用上述256 MB的XDR内存(CPU的主RAM)作为工作空间,不过这会带来一些性能上的影响。 例如,如果渲染后的帧将由SPU进行后处理,这就派上了用场。

正如你所看到的,虽然这台游戏机没有实现统一内存架构,但如果程序员决定这样做,它仍然可以在不同的内存芯片上分配图形数据。 我之所以提到这一点,是因为我希望许多“技术讲解员”在大喊“PS3因为没有统一内存架构而受到限制”之类的过度概括性言论之前,能多了解一下这项功能。 这在某些情况下可能是对的,但除非他们提到这些,否则在我看来,这种笼统的说法是偏误导的。

最后,RSX支持多种形式的数据优化以节省带宽,例如 4:1 色彩压缩、Z压缩和“图块”模式(稍后我会详细解释)。

构造帧

现在让我们看看RSX如何处理和渲染3D场景。

Image
RSX的流水线的概览

它的流水线模型与GeForce3非常相似,但在五年的技术进步中得到了极大的提升。 因此,我建议大家先看看那篇文章,因为这篇文章的重点将放在新功能上,我还建议大家阅读PlayStation Portable的GPU,因为很多新的发展和需求都与该芯片重叠。 话虽如此,让我们来看看这里有什么[29]……

指令

Image
取指阶段示意图

与其他GPU一样,必须有一块电路负责接收来自外部的指令。 在RSX中,这由主机图形前端两个模块负责。

主机负责从内存(本地显存或主内存)中读取命令,并将其转换为RSX中其他组件可以理解的内部信号,这需要使用四个子块来完成:

  • 推送器(Pusher):从内存中获取图形指令并解释分支指令。 它还包含1 KB的预取缓冲区。 处理后的命令发送到FIFO缓存。
  • FIFO缓存:以先进先出的方式存储多达512条由推送器解码的命令,以提供快速访问。
  • 拉取器(Puller):顾名思义,当 RSX 准备好渲染时,它会从 FIFO 缓存中拉取命令,并将其发送到下一个单元。
  • 图形FIFO:最多可存储8条命令,图形前端将读取这些命令。

然后,图形前端从图形FIFO读取数据,并向RSX内部所需的单元发出信号,以计算操作。 如果你还记得,这相当于GeForce3中的“pfifo”。

正如您所看到的,命令和数据在到达最终目的地之前会经过许多缓冲区和缓存。 这是有意为之,因为这样可以防止不同的单元和总线以不同的速度运行而导致流水线停滞。 因此,只要有可能,缓存内存就会利用快速带宽。

顶点着色器

Image
顶点阶段流程图,注意如果顶点不需要顶点着色器进一步处理,顶点处理引擎(VPE)就会被绕过。

下一个单元是几何处理块,它是GeForce3中“顶点块”的进化版,用于执行顶点变换。 它仍然可以使用顶点着色器进行编程,这已成为图形行业广泛采用的功能。 此外,指令限制已增加到最少512条(最初的限制是136条!)。

执行着色器的程序块称为顶点处理引擎(Vertex Processing Engine,VPE),每个时钟周期可以处理一个顶点。 如果还嫌不够,还有八个VPE并行工作。 从GeForce6系列开始,英伟达将着色器编程接口与“顶点着色器模型3”或者叫 “vs_3_0_”的模型相统一,它是微软开发的用于DirectX 9.0c库的标准[30]。 VPE还支持非专有的OpenGL 2.1模型[31]和英伟达自己的变体(Cg)[32]

与GeForce3相比,我们为分支和子程序调用提供了新的指令。 此外,VPE包含四个纹理采样器,可在此阶段提取纹理颜色,以备程序员使用该单元对纹理颜色执行某些操作。

几何图形处理模块是这样工作的:

  1. 索引顶点处理器(Index Vertex Processor,IDX)从VRAM中获取并缓存顶点数据和纹理。 然后,它将数据发送到VAB。
  2. 顶点属性缓冲器(Vertex Attribute Buffer,VAB)从IDX缓存中提取数据,并将其重定向到每个VPE。
  3. 每个VPE根据加载的着色器处理数据。 每个时钟计算一条着色器指令
  4. 每个VPE的结果都会发送到后变换缓存,该缓存会缓存结果,以跳过对相同顶点的相同计算。 这仅适用于使用顶点索引而非顶点数据的情况。
  5. 最终结果将存储在视口剪切单元(Viewport Cull Unit,VPC)和属性RAM(Attribute RAM,ATR)中,前者应用剪切功能丢弃视口以外的顶点,后者缓存顶点属性(纹理、颜色、雾等),以便在下一阶段读取。

光栅化

Image
光栅化阶段简图。 RSX嵌入了不同的单位,用于计算像素和颜色的插值。

接下来就是将顶点转换(光栅化)为像素。 RSX的光栅化器速度非常快,每个周期最多可光栅化8x8像素(64),帧缓冲区最大可达4096x4096像素(不过开发人员可能需要小于此值的缓冲区)。

光栅化器可处理点、线(包括条形和封闭类型)、三角形(包括条形和扇形)、四边形和正多边形。 当然,与本游戏机一样,光栅化器也使用亚像素坐标,即采样点为像素的半坐标(0.5)。 这样就可以在之后应用多重采样等抗锯齿方法。 多重采样包括多次栅格化相同的几何图形,但每次都要移动几个子像素(RSX支持四种不同的移动模式),然后计算平均值。 这样就得到了平滑图像。

此外,该设备还可以使用RSX的专用RAM(容量约为 300 万像素)执行Z剔除(z-culling)。 这样可以节省对已经渲染的像素和模板的处理,并可以对输入的几何图形进行早期Z测试

另一个单独的单元用于光栅化2D物体(精灵),但该单元与3D流水线隔离。 因此,RSX可在2D和3D两种模式下工作,但间歇性地在两种模式间切换会耗费大量性能。

像素着色器

Image
像素/片段阶段图

接下来是片段着色器和纹理块,这是一个可编程单元(通过使用“片段程序”或“着色器”),用于应用纹理映射和其他效果。

作为GeForce3纹理单元的高级继承者,新块包含6个片段单元(也称为“管道”(pipes)),每个单元处理2x2纹理元素(texels)(命名为“quads”)。 为了组织多个单元同时工作,另一个名为“着色器四分配器”(Shader Quad Distributor,SQD)的子块将四边形分配给每个片段单元。 然后,每个片段单元加载片段程序。

为了计算操作,每个管道都包含_庞大_数量的,1536个128位寄存器。 此外,每个管道可并行处理多个quads(多线程),但并行处理的quads数量取决于分配给片段程序的寄存器数量(线程数=1536÷着色器预留的寄存器数)。 就全局而言, 最多可并行处理460个四边形。 此外,只要指令不相互依赖,最多可有三个片段管道同时处理两条指令(双发射,像PPU一样)。

片段单元提供与顶点单元类似的算术型指令,并增加了与纹理相关的操作码,如多种类型的纹理获取(因为纹理可以使用多种结构编码,然后进行压缩)和解压缩。 与顶点块类似,片段着色器也遵守DirectX的像素着色器3.0模型[33]、OpenGL的NV_fragment_program2配置文件[34]和Cg的“fp40”配置文件[35]。 所有这些都是为了简化编程,避免从头开始学习低级API。

最后,由于各单元将不断从视频RAM或主RAM中获取纹理片段,因此该模块包含三个纹理缓存: 每个管道有4 KB的L1 Cache,视频RAM有48 KB的L2 Cache主RAM有96 KB的L2 Cache。 请注意,主RAM缓存的容量要大得多,这是为了弥补较高的延迟而做出的明智决定。

像素操作

Image
后处理阶段

在将结果写入帧缓冲区(存储在VRAM或主RAM中)之前,最后一个名为光栅操作块(Raster Operation Block,或ROP/光栅操作单元)的模块会对生成的像素进行最终测试。

有两组ROP,每组由四个块组成(共八个)。 每组执行Z测试、Alpha混合和最终写入内存。 总之,该电路每个时钟可处理多达16个Z值和8种像素颜色。 奇怪的是,PC版的英伟达7800 GTX显卡配备了16个ROP,而不是8个,也许这一削减是为了优先考虑SPU消耗的内存带宽?

为了进一步节省带宽,ROP还提供了色彩压缩和Z压缩功能。 此外,还有一种Tiling模式可用于优化视频编码器的内存访问。 在Tiling模式下,帧缓冲区被存储为连续的128 B 块,以与广播/扫描相同的方式排序。 这样,GPU在传输帧缓冲区进行显示时就无需进行页交换(用于内存寻址),从而提高了带宽。 这些“图块”存储在内存中专门用于这种寻址方式的标记位置。

统一的视频输出

游戏机专用视频插座和十几种模拟信号挤在一个插座里以适应全球各个地区的时代已经一去不复返了。 PlayStation 3最终采用了即将在全球范围内普及的统一视频信号:高清媒体接口(HDMI),用于同时传输音频和视频。

Image
PS3背面,HDMI输出端位于左侧,另一端是老式的多路A/V模拟视频输出端。

HDMI接口由19个针脚[36]组成,全部安装在一个插座中。 它传输的是数字信号,这意味着图像和音频是通过离散的0和1(而不是模拟信号中的连续值范围)来传输的。 因此,它不会像以前的设备那样受到干扰或图像质量下降,如廉价的 SCART 电缆产生的屏幕伪影。

时至今日,HDMI协议仍在不断修订[37],新版本的规范提供了更多的功能(如更高的图像分辨率、刷新率、替代色彩空间等),同时保留了相同的物理介质以实现向后兼容性。

在PS3的整个生命周期中,索尼通过软件更新为PS3增加了新版本的某些HDMI功能[38]。 与PS3兼容的最后一个协议是1.4版,该协议最显著的特点是支持“3D电视”,但其他功能,如更高的视频分辨率,PS3仍被限制在1920x1080像素(即使如此,大多数游戏的帧缓冲区仍被限制在1280x720像素)。

“真正的”3D视觉/投影

那么,我之前提到的“3D电视”是什么呢? 这台游戏机的生命周期恰好与3D电视(所谓的_3DTV_ )的短暂热潮重叠[39]。 为了支持这股热潮,索尼更新了他们的SDK,以协助在RSX中渲染立体帧,并在HDMI编码器中实施了 “3D规范”。 在幕后发生的事情是,编码器一次播放两个画面,电视交替播放,就像30年前Master System的3D眼镜所做的那样。


音频

恐怕你不会再在这部分看到很多信息了,主要是因为自从上一次便携式设备发明以来,音频已经_悄无声息_地转移到了软件方面。 换句话说,现在已经没有专用的音频芯片了。

你看,虽然对更好图形的需求呈指数级增长(消费者需要更多的场景、更好的细节和色彩),但你不会听到对声音有同样高的要求。 我想这是因为我们的认知能力已经达到了极限(44.1 kHz采样率和16位分辨率)。 唯一剩下的就是实现更多的声道和效果,但这些并不需要安装专用芯片的处理能力,至少在消费电子上是这样。

Image
音频流水线概要。

因此,音频现在完全由软件实现,并由SPU们(我指的是协同处理器单元,而不是声音处理单元! 有点讽刺的是,两者的首字母相同……)进行处理。 接下来,索尼在其SDK中提供了许多库,用于指导SPU执行音频排序、混音和流式传输。 如果这还不够,还可以应用许多效果。

话虽如此,广播的音频信号发送到哪里呢? RSX。 该芯片还包含用于向电视播放原始音频信号的端口。 在发送之前,信号会根据所选的输出(模拟、HDMI或S/PDIF,后者也称为“数字音频”)以不同的格式进行编码。


I/O 和向后兼容性

所有 I/O 操作都交由另一块名为南桥(Southbridge)的大块芯片完成[40]。 这与当年最初的Xbox采用的架构非常相似。 游戏机之间的架构差距似乎越来越小了,也可能是这种方法被证明非常可靠,而且与架构无关,我就让你来决定吧。

Image
大大的南桥芯片负责监控小型I/O芯片和接口。
Image
带有重要部件标签的同一张图

与PS2的IOP一样,南桥芯片也是完全专有的,不过这次是由东芝制造的(他们称之为“超级伙伴芯片”(Super Companion Chip)[41])。 因此,虽然它仍然是一块不起眼的芯片,但却能出色地整合许多接口和协议,包括外部接口(如 USB、以太网等)和内部接口(如 SATA)。 作为参考,过去IOP较慢的时钟速度最终会对ATA和以太网等高速接口造成瓶颈,大大降低它们的全部带宽。

此外,南桥还采用加密算法,以无缝方式保护标准协议之间的通信,如硬盘数据。

Image
南桥连接示意图

总的来说,南桥嵌入了大量接口,这与这款游戏机是在“多媒体集线器”潮流中设计的有关。 对于视频游戏机来说,仅仅玩游戏是不够的,它们还需要成为DVD和蓝光播放器、机顶盒(部分)、照片查看器(通过使用多卡读写器导入相机的照片),而且随着需求的发展,可能还会有更多的功能(得益于其可更新的操作系统)。

外部接口

Image
与那个时代的许多PC(包括我的PC)一样,多卡读写器也是必不可少的。 旁边还有四个USB 2.0端口。
对于售价425英镑的游戏机来说,这已经很“高级”了! (以2021年的价格计算为628英镑)。
Image
盖上盖子后的同一台游戏机。
为了进一步降低成本,后来的机型封死了这个槽,去掉了读卡器和两个USB端口。

在用户可访问的端口方面,南桥连接到:

  • USB 2.0集线器:提供四个前置 USB-A端口。 这些端口可用于连接配件或为手柄链接/充电。
  • 串行ATA(SATA)接口:连接蓝光光驱和2.5英寸硬盘。
    • 2008年之前,蓝光光驱使用的是并行ATA接口[42],因此中间需要安装一个中间芯片来完成SATA→PATA 转换。
  • 1000/100/10(千兆)以太网控制器:采用背面RJ45插座的形式,但也分叉到无线子板,提供Wi-Fi 802.11b/g蓝牙 2.0连接。
  • 多卡读写器:提供记忆棒(Memory Stick)、SD、多媒体卡(MMC)、微型硬盘和Compact Flash(CF卡)插槽。

”少线“设备

由于蓝牙技术的广泛应用,有线控制已成为过去。 PS2 的Dualshock 2控制器的新形式被称为Sixaxis,虽然它并没有像其他厂子决定的那样进行彻底改变,但它配备了一个陀螺仪,可实现新型的人体输入。 不过,这是以牺牲触觉反馈(Rumble/震动)为代价的。 一年后,索尼推出的Dualshock 3给玩家带来了惊喜,它恢复了触觉马达。

换个话题,现在你可以通过无线控制器启动游戏机了。

内部接口

关于内部组件,南桥可连接以下设备:

向后兼容性

既然提到了PS2芯片,我想这就是我一劳永逸地谈论PlayStation 3向后兼容性的时候了。

首先,让我来介绍一下向后兼容性的一般工作原理:游戏机可以通过软件(指示现有硬件按照旧游戏的预期运行)和硬件(现有硬件提供全部或部分向后兼容性;和/或公司添加额外芯片,在新主板上重新创建旧系统)的帮助来玩上一代游戏机的游戏。 以PS3所显示的处理能力,你会期望索尼能提供一个在Cell内运行并由RSX加速的PS2模拟器。 但出于某种原因,索尼并没有这样做,而是在主板的一角安装了PS2的芯片组。

Image
大大的EE+GS芯片、两个16 MB RDRAM 模块和“PS2桥接器”
Image
带有重要部件标签的同一张图

另一方面,缺失但不太关键的芯片(IOP、SPU等)则通过Cell中运行的软件进行模拟。 就游戏存档而言,最初用户需要购买存储卡适配器,但新软件更新后,存储卡现在被模拟为存储在硬盘中的磁盘映像,而Magic Gate(加密系统)则由一个SPU无缝处理。

由于Cell和RSX在玩PS2游戏时仍处于“开启”状态,因此系统提供了两种缩放方法来增加游戏时的屏幕面积,这两种方法是“近邻”或“平滑”(抗锯齿)。

![PS3的用户界面,显示插入PS2光盘后的游戏入口。
(暂时不用担心其他图标,因为有些甚至不是官方图标)。

](xmb/ps2.jpg)

总之,有了这种设置,PS3 运行PS2游戏的兼容性令人印象深刻。 除此之外,你还可以利用新游戏机自带的新功能(无线控制、HDMI接口和虚拟存储卡)。

此外,PS1游戏也能运行,这次无需嵌入旧的SoC或GPU(依靠纯软件模拟)。

期限的奇怪终结

在PS3的整个生命周期中,索尼慢慢地将PS2芯片从PS3主板上剥离,以至于向后兼容性只能通过软件实现(有更多限制,例如只能运行从在线商店购买的PS2游戏)。 由于索尼从未更换过PS2芯片组(就像之前在PS2中更换PS1硬件一样),这不禁让人怀疑其背后的技术和管理理念。 那么,作为一个案例研究,我在这里简单谈谈我对这一原因的看法:

我个人认为,从长远来看,纯软件模拟是最可行的选择,因为它具有可扩展性、定制性和独立于专有硬件的特性。 当然,这需要付出更多努力才能准确实现,由志愿者驱动的社区正在开发的PCSX2就证明了这一点(但请注意,上述模拟器只能在x86 PC上运行)。

横向兼容性

关于兼容性的话题还没有结束! 索尼还允许用户运行部分PlayStation Portable游戏,这可能会让你大吃一惊。 尽管仿真完全是通过软件进行的,就像后来的PS2机型的兼容性一样。

由于PS3没有UMD光驱,用户必须从索尼在线商店访问游戏目录,才能下载和安装任何PSP游戏。


操作系统

现在,家用游戏机已经成为功能强大的多媒体中心,因此需要一个更加_错综复杂_的操作系统,以更厚的抽象层为用户提供更多的服务和游戏。 所有这些,都需要在保证安全性和性能的前提下完成。

因此,我们不再使用shellBIOS等术语来描述这一领域,不是因为它们不存在了,而是因为它们只描述了新系统的一小部分。 现在的通用术语是“操作系统”,它由许多方面组成(引导加载器、内核、用户界面),并分别进行分析。 像往常一样,我建议先看看PSP的操作系统,因为它的模块化设计是PS3的一大特色。

Cell的权限安全

在我们深入探讨细节之前,我需要提一下Cell的不同运行模式。 我原本打算在“CPU”部分对此进行描述,但由于篇幅过长,我还是在这里介绍一下,你会马上看到它的实际用途。 此外,它的模式也会影响在Cell中运行的任何操作系统的设计,而不仅仅是索尼为这款游戏机开发的操作系统。

尽管如此,为了防止未经授权访问敏感数据和/或资源,Cell实现了一套继承自PowerPC规范的权限级别。 换句话说,Cell在两种模式下执行程序:

此外,SPE还包含一种称为隔离模式的工作方式,它可以屏蔽SPU内的执行进程,因此在SPU完成之前,任何外部单元(PPE或其他SPE)都无法访问该进程。 在向任何SPE上传程序后,都可以激活这种模式,确保处理器在执行敏感代码(如加密例程)时不被篡改。

索尼的操作系统(我将在下面的段落中加以介绍)采用了上述所有模式来处理其安全性问题。

概述

正如我之前所说,这个操作系统相当复杂。 因此,为了能够顺利地跟上本节内容,我们可以将游戏机操作系统中的文件类型分为不同的层次:

操作系统的安全层次

总的来说,PS3的操作系统采用与PSP相同的模块化设计。 回顾前文,操作系统由多个模块组成。 这些模块可以为用户服务(如游戏或应用程序),也可以无限期地驻留在内存中,为其他模块服务(以系统调用和/或驱动程序的形式)。 有些模块比其他模块拥有更多的访问权限(内核模块与用户模块)。

Image
PlayStation 操作系统各组件与 Cell 权限级别的关系图。
有关“其他操作系统”的内容将在接下来的章节中进一步解释。

操作系统在其整个生命周期中会调用许多具有不同权限的模块。 索尼在构建操作系统时,将模块置于Cell的三个权限级别之下:

存储介质

说了这么多,这些数据存储在哪里呢? 从普通用户的角度来看,只有两种可见介质: 存储游戏的蓝光光盘和存储数据的硬盘。 当然,还有其他一些介质,我们现在就来一一介绍!

Cell BootROM

原来,在Cell中隐藏着一个小ROM,制造商可以将“受保护”的bootloader存储在其中。 IBM提供这个空间是为了让任何公司(不仅仅是索尼)不必手动实施定制的混淆方法来保护他们的启动代码,因为现成的组件并不总能满足客户的需求。

由于这部分代码已经受到混淆的物理保护,因此无需加密。 因此,它是第一阶段bootloader(无法加密)的理想选择,PlayStation 3将其早期启动阶段存储在这里。

NAND/NOR闪存

还记得我之前简单提到的256 MB NAND闪存吗? 大部分操作系统都在这里。 直到索尼在2007年底发布了_CECHH_机型,将256 MB NAND闪存替换为缩小的16 MB NOR闪存。 因此,一些文件不得不转移到其他地方。 为简单起见,我们先来看看这些芯片存储了什么[55]

  • 游戏机专用Loader:特别是两个名为bootldr和metldr的加载程序。 这些文件在制造过程中用刻密钥的方式加密,因此无法替换!
    • 尽管如此,索尼的管理程序中有一些隐藏功能可以更新这些文件,不过由于某些原因,这些功能从未被使用过[56]
  • CoreOS:操作系统的前半部分。 它主要由更多的加载器组成,这些加载器将继续启动过程,并最终引导后半部分(GameOS)。 CoreOS还提供恢复菜单(Recovery Menu),这是一个包含维护实用程序的替代外壳,用户可以用它来(尝试)修复游戏机。
  • 唯一ID:与PSP的IDStorage类似,这些ID被游戏机用来控制安全硬件(如蓝光光驱);或被索尼用来在其在线服务器上对游戏机进行身份验证(即IDPS密钥)。
  • 安全资产:某些程序依赖它们执行安全操作。 例如,带有DRM的蓝光电影会检查称为虚拟表权限管理 (VTRM) 的区块。 索尼还存储了撤销工具和记录,用于将过去被泄露的安全证书列入黑名单。

由于NAND闪存体积较大,采用NAND闪存的机型还存储操作系统的剩余部分(称为GameOSdevflash)。 这包括:

  • 可视化Shell(VSH)PSP标志性界面的延续,还捆绑了大量模块(插件)和资产。
  • 模拟器:上述程序可让PS3运行PS1、PS2或PSP游戏。 具体加载哪个PS2模拟器取决于游戏机的版本(是否有完整的PS2硬件、部分硬件或完全不使用PS2硬件)。
  • 运行库:使用索尼SDK开发的程序与存储在这里的一组库动态链接。
  • 蓝光播放器:处理与蓝光驱动器交互和电影解码的程序。
  • 系统资产:如二进制文件赖以运行的字体和证书。

如果这还不够,NAND游戏机还存储了其他数据,如xRegistry(收集网络设置、PlayStation网络账户和蓝牙配对设备列表)、更多撤销记录和其他操作系统的加载器(一个非常有趣的部分,我们将在接下来的段落中详细讨论)。

硬盘

首次亮相的2.5英寸硬盘容量从20 GB到500 GB不等(随着更多版本的推出),可为以下方面提供持久的数据存储空间:

  • 用户内容:包括游戏保存、奖杯(更多信息请参阅“游戏”部分)和其他用户相关数据。
  • 游戏资产:游戏可将文件从光盘复制到硬盘,以缩短加载时间。 操作系统将这些文件视为“游戏数据”。
  • 缓存(Cache):游戏可使用一个单独的2 GB分区进行临时存储(以防主内存不足)。

不过,用NOR闪存的机子也会将GameOS储存在硬盘中。 因此,每当用户更换硬盘时,游戏机都会请求更新文件,以便将GameOS重新安装到硬盘中。 尽管如此,没有硬盘,NOR和NAND机子都无法启动。

某些用户数据可以使用U盘备份,然后在需要时转移到另一个游戏机上,不过这个过程会在复制旧数据之前重新格式化新的游戏机。

eMMC

2012年,索尼推出了重新设计的改版游戏机“超薄机”(“SuperSlim”)(代号 CECH-4xxx)。 这些产品有三种配置: 一种是250 GB硬盘,另一种是500 GB硬盘,还有一种只有12 GB eMMC内置闪存。 前两种选择沿用了NOR型号的文件系统布局,而第三种选择则将所有内容(包括用户数据)存储在eMMC中,并沿用NAND布局来存储系统文件。

不过,eMMC机型有一个缺陷。 根据PS3 Dev Wiki[57],索尼在NOR芯片上安装了松下的MN66840芯片,似乎将NOR总线重定向到了eMMC。 我认为这只是为了节约成本而采取的一种技巧,因为它再利用了其他变体机型的相同南桥。

奇怪的是,如果用户决定在eMMC机型上安装硬盘,游戏机就会将所有用户数据从eMMC移到新硬盘上。 因此,用户可以充分利用硬盘,尽管eMMC中的空白空间现在被浪费了。

启动过程

好了,利用前面所有的知识,你现在要学习系统是如何启动的——让我告诉你,这相当复杂。 原因很简单: 索尼不希望你在他们的硬件或软件上做手脚,所以他们做了很多层混淆和加密,以防止你闯入并侧载你自己的代码(希望你_放弃并继续购买他们的游戏/电影/什么的_),但历史会告诉你,事实恰恰相反。

在下面的章节中,我将介绍一旦你按下电源按钮,这台游戏机会做什么。 请注意,这个过程只发生过一次重大变化(在黑客破解之后)。 因此,为了简单起见,我们将从“初版”启动过程(在系统3.60版之前实施)开始[58] [59] [60]

  1. 主板上的一个独立芯片(称为Syscon)启动并执行其内部ROM中的指令。 然后,它通过SPI(串行连接)向Cell发送“配置环”(Configuration Ring),初始化Cell并停用第八SPU。 最后,它锁存电源线,赋予Cell生命。
  2. Cell的PPU复位向量指向隐藏的ROM,其中存储了从闪存中定位和解密bootldr的例程。 解密后的程序由处于隔离模式的第一个SPU加载。
  3. 现在被隔离的SPU加载bootldr后,初始化部分硬件(XDR内存和I/O接口),解密名为lv0的二进制文件,并指示PPU运行。
  4. PPU 现在执行lv0,解密metldr(游戏机专用加载程序)并将其发送给第三个SPU,同样处于隔离模式。
  5. 现在执行metldr的SPU2依次执行另外五个加载程序:
    1. lv1ldr解密并加载lv1,其中包含接管第一级权限的管理程序。 此外,lv1还设置了硬盘、蓝光光驱和RSX。
    2. lv2ldr解密并加载lv2,它包含内核并在管理程序之上运行。 它还能完成RSX、PS2仿真、蓝牙、USB控制器和多卡读写器的初始化。
    3. appldr解密并加载vsh可视化Shell)和其他依赖项。 vsh稍后将允许用户加载游戏。
    4. isoldr解密并加载将在第三个SPU隔离模块中运行的模块。 这些模块对安全性至关重要,在整个游戏机生命周期中执行许多加密功能。 因此,第三个SPU被保留用于安全功能,游戏无法使用(游戏只能使用六个SPE)。

加载vsh后,PPU通过图形用户界面授予用户控制权,图形用户界面会发出标志性的_管弦乐启动音效_,随后出现_XMB_菜单。

修订后的启动程序

2011年3月,一个名为“GeoHot”的黑客破坏了metldr的安全性,从而损害了后续Loader的真实性。 因此,索尼通过发布硬件和软件安全更新进行报复。 本文的“反盗版”部分将进一步讨论这些修复措施。

Visual Shell

你是否已经厌倦了这些理论? 让我来谈谈大家都能看到的东西: 可视化Shell

XrossMediaBar(XMB)两年前在国际上获得认可的新用户界面,现在已稍作调整,使其可以在沙发上进行交互(即所谓的“10英尺用户界面”),并扩展到“全高清”分辨率(FHD,1920x1080像素)。

Image
PSP版XMB界面(2004)
480x272像素下渲染
Image
PS3版XMB界面(2006)
1920x1080像素下渲染

虽然PSP用户会发现许多熟悉的功能,但索尼还增加了一套新的应用程序,利用Cell、RSX和蓝光光驱的潜力。 其中许多与多媒体(如视频播放器和图片幻灯片)、电视(如点播电视应用程序,如BBC的iPlayer)、社交(在线头像)和在线购买(PlayStation Now和PlayStation Store,仅举几例)有关。

此外,由于这是一台可能由多个成员共享的家用游戏机,XMB支持多用户,每个用户可以使用不同的PlayStation Network账户,并存储独立的用户数据(已购买的游戏和保存)。

Image
就像在PSP中一样,选中一个游戏可能会使背景风格化,以引起你的注意!
Image
XMB 提供了大量的设置功能,尤其是当你需要为闪亮的1080p新电视设置3.1环绕声时,它能帮上忙。
Image
各种各样的多媒体设置
Image
XMB可以使用本地软件包安装程序安装游戏及其更新和扩展(DLC)。

最后,硬盘的加入让老手们松了一口气,因为过去只要空间不够,他们就不得不购买昂贵的专有存储设备(Memory Stick Pro Duo)。

把你PS3借给我

令人印象深刻的是,并不是每一个与这款游戏机捆绑的应用程序都是以_自身利益_为目标的。 随着分布式计算的出现以及Cell在数据科学项目中的功能,斯坦福大学与索尼联手,让PlayStation 3的用户为医学研究做出贡献。 这就是Folding@home(读作 “在家折叠”)。

Folding@home是一个安装在每台PlayStation 3上的应用程序,用户打开后即可连接到中央服务器并运行蛋白质模拟。 此外,该应用程序还可以在非高峰时段在后台运行。

Image
Folding@Home显示用户启动应用后完成的工作[61]

在其整个生命周期中,全球1500万PS3用户的联合计算能力协助Folding@home开展了治疗阿尔茨海默病的研究[62]。 最后,Folding@home和索尼于2012年退役了该应用,而前者则在其他平台上继续使用。

这是我的个人观点,但我喜欢阅读利用分布式计算能力为全球做出贡献的项目,而不是永无止境的关于加密货币挖矿的耸人听闻的文章。 我想我们不应该忘记,每一种新的强大技术,总会有无私的应用被开发出来。

多操作系统建议

IBM在从软件层面描述Cell时提到,由于Cell有很多执行核心,因此能够同时运行多个操作系统[63]。 因此,索尼将这一想法付诸实践,在XMB中添加了一个安装第二操作系统的选项[64]。 这项功能被称为OtherOS,简而言之,它提供了一个分区管理器(XMB只是引导用户调整GameOS分区的大小,并为第二个操作系统分配新的空间)和一个从第二个操作系统启动的按钮(由于OtherOS的启动文件已在Flash中设置)。 因此,用户只需将操作系统填入新分区即可。 因此,许多Linux发行版(如Ubuntu和Fedora)都将 PS3作为另一个可能的安装目标。 你可以将其视为 Linux for PS2 的精神继承者。

Image
Red Ribbon GNU/Linux是PS3/Cell独家发行版,使用PPC64目标机编译[65]

得益于OtherOS,有经验的用户有机会开发在Cell上运行的自制应用程序,而不受许可限制,这对于研究/科学用途尤其有趣[66] [67],因为这种游戏机的价格比大型机更实惠。 在多媒体方面,蓝光驱动器和多卡读写器也可以通过其他操作系统访问。

另一方面,虽然OtherOS的权限可能超过GameOS(在内核层面),但它们并没有超过管理程序,后者仍驻留在内存中。 因此,OtherOS的任何硬件访问仍然取决于索尼管理程序的意愿,而后者恰好阻止了对RSX命令缓冲区的访问(阻止使用着色器单元和其他用于加速图形操作的组件)。 因此,Linux发行版只能使用软件渲染(所有图形都由Cell绘制),然后将帧缓冲区流式传输到RSX显示。 虽然OtherOS无法充分利用该游戏机的全部功能令人失望,但这样做可能是为了减少攻击面。 具有讽刺意味的是,OtherOS对Cell的使用类似于IBM/东芝/索尼最初对PS3的设想!

与Folding@home的命运相同,OtherOS最终在后续更新中被移除,但原因不同(主要与安全有关)。 不久之后,由于软件漏洞和逆向工程的努力,OtherOS被_非官方地_恢复了。 目前,如果用户安装了_定制固件_,就可以使用OtherOS。 我将在“反盗版和自制软件”部分对此作进一步解释。

在撰写本文时,开发人员René Rebe正在实施适当的xf86驱动程序,以利用RSX及其256 MB内存提供的加速功能[68]。 他的工作与其他开发工作相结合,消除了管理程序施加的限制(最初得益于软件漏洞的发现,后来使用了_定制固件_,后者在“反盗版和自制软件”部分有进一步解释)。 Rebe先生在他的Youtube频道上发布他的研究进展,并依靠自愿捐款继续他的工作[69]

可更新性

最后,我们来谈谈GameOS的更新能力。

简而言之,与PSP一样,索尼也分发了PS3UPDAT.PUP文件,其中打包了所有新的操作系统二进制文件。 由于游戏机的安全系统,只有那些未使用唯一的游戏机密钥保护并存储在可重写存储器(闪存、硬盘、eMMC)中的文件才可更新,其他文件必须保持原样。

PUP文件通过索尼官方网站、XMB更新助手或游戏光盘中的内容发布(所有游戏都嵌入了PUP文件,反映了为其开发的SDK版本)。 由于使用NAND闪存的机型仅有256 MB的空间,并将整个操作系统存储在其中,因此索尼从未发布过大小超过256 MB的更新文件。


游戏

本节包括与游戏开发、发行和服务相关的主题。

开发生态

由于这款游戏机融合了多家公司的技术,包括已在其他市场商业化的产品(如英伟达用于PC的GeForce7 显卡系列),开发人员在开发软件时被淹没在众多不同的工具中。 请注意,这并不意味着开发很容易,但与汇编时代相比,这一点还是值得赞赏的。

为了给Cell编程,IBM和索尼分别提供了不同的开发套件,IBM的套件针对Linux(和OtherOS)等非限制性环境,而索尼的工具则明确将PS3的GameOS作为唯一的执行环境。

尽管如此,IBM还是免费发布了IBM Cell SDK软件包[70]。 它包括经过修改的GCC工具链,用于生成PPU和SPU二进制文件,允许使用C、C++、Fortran和汇编语言进行开发。 它还具有跨平台性,可以从其他设备(如 x86 PC)编译代码。 SDK还包括底层库,便于进行SIMD数学运算和SPU-PPU管理。 最后,它还捆绑了一个Eclipse IDE的分支。

为了降低Cell开发的复杂性,IBM还开发了另一款名为XLCL的短命编译器,用于编译PPU和SPU的OpenCL代码(用于并行计算的C/C++变体)。 不过,这种编译器只通过IBM的Alphawork渠道发布,这意味着它仍然是试验性的。

那么索尼呢? 与PSP SDK类似,他们也提供了硬件开发包(许多具有不同尺寸和增强功能的变体)以及由编译器、库和调试器组成的软件包,这些软件包使用Visual Studio 2008(以及后来的2010)作为IDE[71]。 由于只支持PS3,他们的SDK包括相同的GCC工具链,但辅以大量的库来协助图形任务、音频和I/O。 在图形/RSX方面,索尼提供了GCM来构建原始命令,并在GCM的基础上构建了psGL,以提供OpenGL ES API。 为了编写着色器,英伟达提供了Cg,这是一种着色器编译器,可以解析类似于HLSL(微软定义的着色器语言)的语言。

免授权开发

随着原生自制软件(运行于GameOS,而非OtherOS)的出现,新的开源SDK应运而生,以避开对索尼版权库的依赖,从而避免版权诉讼。 PSL1GHT就是一个例子,它是一个与ps3toolchain结合使用的SDK[72],为开发合法的自制软件提供了一个完整的开发套件(不过这需要修改/黑入控制台,并禁用签名检查)。

早在2018年,我就基于ps3toolchain构建了自己的套件,但以Docker容器的形式发布[73],这样开发者就不需要编译ps3toolchain,而是下载我预先编译好的设置(节省了许多编译时间)。 该容器还捆绑了许多工具,例如英伟达的Cg着色器,以缓解我在实验基于PSL1GHT的项目时发现的依赖性问题。 最后,这是一次有趣的实验,让我对开发环境有了更多了解。

外包开发

值得指出的是,在此期间,一种特殊的企业对企业模式大受欢迎: 游戏引擎。 与其花费时间和金钱从头开始开发一款游戏,为什么不购买其他公司的代码库,然后在此基础上开发游戏呢? 这就是Epic Games等游戏工作室的设想[74]。 除了销售_虚幻竞技场3(Unreal Tournament 3)_等热门游戏外,该工作室还向其他开发者授权了一个精简版(不含资产)。 该版本被打包命名为虚幻3引擎。 简而言之,游戏引擎负责所有基础领域(物理、光照等),因此开发人员只需添加自定义内容(脚本、纹理、模型、声音等)。

游戏引擎授权并不是一种新的商业模式,但由于PS3的环境充满挑战,它们最终成为另一种有吸引力的开发选择。

存储介质

游戏开发谈完了,该说说发行了。 因此,我在这里介绍一下PS3游戏的官方发行机制。

蓝光光盘

Image
零售游戏的例子

新世代=新媒介。 随着DVD的优势开始减弱,以及游戏产业(空间限制)和电影产业(480i格式)[75] 所表现出的局限性日渐明显,索尼迟早会推出另一种标准来取代他们的新设备。 对于这款新游戏机,人们选择了蓝光光盘

蓝光光盘,顾名思义,是一种新的光盘格式,由于使用了蓝光二极管[76],而不是DVD使用的红光二极管,因此存储密度更高。 由于蓝光的波长比红光短,因此在相同的空间内可以挤压出更多的信息(凹坑和平地[77]。 因此,蓝光光盘使用与CD/DVD相同尺寸的塑料光盘,却能提供惊人的大容量(25 GB到50 GB之间!)。

蓝光数据格式满足了不同行业的多种需求:高清电影、数字版权管理(DRM)、锁区、新文件系统,甚至Java程序的运行环境[78]。 在视频游戏行业,PlayStation 3的零售游戏以25 GB 或 50 GB的蓝光光盘形式发行,并带有防拷功能。 这些光盘由2速光驱读取,速度高达8.58 MB/秒[79],不过PS3的激光器也能读取DVD(8速)和CD(24速),以播放旧游戏和电影。

虽然最初的游戏是通过光盘执行的,但后来的游戏将其部分资产复制到了硬盘上,以提高读取速度。 不过,启动游戏始终需要游戏光盘。

在线商店

Image
XMB界面中的PS商店应用
Image
打开商店时展示的游戏目录
Image
搜索界面(顺便说一下,它绕过了XMB的本地键盘)
Image
游戏条目示例(附有只适用于其他游戏机的建议游戏……)。

在游戏机发布的同时,索尼推出了名为PlayStation Store的专有分销渠道,允许游戏工作室以数字方式销售游戏,用户无需离开沙发即可购买新内容。 这些游戏不需要任何物理媒介就能运行(除了硬盘空间),但数字产品的所有权与在线账户绑定,这一点在2021年3月成为了用户关注的焦点,当时索尼宣布了(并后来撤回了[80])关闭这个商店的计划。

在数字商店中,索尼还借此机会出售PS1、PS2和PSP游戏的数字版,称为PlayStation Classics。 这些游戏的下载和安装方式相同,但使用捆绑的模拟器。 事实上,无论PS3机型是否包含PS2芯片组,PS2 classic版游戏都会调用相同的非加速软件模拟器[81]! 我猜这就是PS3基于硬件的模拟功能的终结篇章。

在幕后,PS Store只是一个只能通过XMB中的PS Store应用程序访问的网站。 在整个生命周期中,它的用户界面经过了数次改版,我想这是为了反映_全球对更花哨的用户界面的需求_。

网络服务

除了在线商店,该平台还增加了许多在线解决方案,包括首次推出的PlayStation Network,这是一项免费的在线服务,直接与微软的付费Xbox Live竞争。

PlayStation Network使用户能够创建一个个人账户并分配一个化身,然后使用这个新的数字角色进行多人游戏、留言和其他社交互动。 如果用户在游戏中完成了某项活动,还可以获得奖杯,然后这些奖杯就会显示在在线个人资料中(就像某种形式的荣誉勋章一样),以威慑对手并赢得朋友的尊重。

Image
游戏提供成就目录来挑战用户。 其目的是让玩家获得自豪感和成就感。
Image
好友列表 (由于显而易见的原因,姓名被打码)
Image
在玩了一段时间的在线游戏后,开始有人给我发信息。

最后,就像拥有一个可更新的操作系统一样,游戏也会更新。 因此,在启动游戏时,XMB可能会建议下载游戏更新(以“包”的形式),以修补漏洞和/或添加新内容。 更新安装在硬盘中,工作原理与_分层文件系统_类似。


反盗版和自制游戏

您刚刚阅读的所有内容都必须受到某种保护,以防止“未经授权”的访问。 如果你想了解索尼是如何做到这一点的,那你就大开眼界了。

安全基础概述

游戏机的许多部分已经提供了无需在软件中手动实现的安全功能:

除此之外,索尼还在软件中实施了以下保护措施:

击败

你已经看到了这款游戏机的能力有多强,难道你还指望黑客们会满足于OtherOS的有限功能吗? 我猜索尼也没有,该公司竭力保护某些领域,却让其他领域半封闭,黑客们稍后就会证明这一点。

请记住,PS3黑客社区非常活跃,每年都有许多工具和文档问世。 因此,我将重点介绍为大量内容和自制软件开发铺平道路的几个里程碑,但你可以在PS3History[87]上找到更多信息。

绕过管理程序

2010年,在黑客界沉寂了三年之后,社区出现了转机。 George Hotz是一位因解锁第一代iPhone机型(又称“2G”),使其可以在任何网络下使用(最初只能在Cingular/AT&T网络下使用)而闻名的黑客,他成功地读写了内存中的保护区,而没有被虚拟机管理程序阻止。 随后,他在自己的博客中发布了漏洞利用方法和简短摘要[88]

该漏洞需要两种材料:一个在OtherOS下运行的Linux(用于执行任意但有限的代码);一个连接到XDR总线(连接主RAM)的外部glitcher。 长话短说,管理程序使用存储在主RAM中的哈希表来编目内存地址及其权限级别,因此用户程序无法访问受保护的内存空间。 这种攻击通过破坏哈希表的完整性来实现写入,然后利用这种权限修改条目,使当前程序可以访问内存中的每一个角落。

总之,Hotz发现,在Linux/OtherOS下,程序可以向管理程序请求许多指向同一物理地址的内存块,但如果程序在XDR总线受到外部干扰(由于glitcher发送电脉冲)的情况下取消分配这些内存块,取消分配过程就会半途而废[89]。 因此,管理程序的哈希表(位于RAM中)仍然包含一个已分配地址的条目,但同时它认为该空间已被释放。 Hotz的漏洞会继续请求更多的区块,这样管理程序就会用更多的条目扩展它的表,这个过程一直持续到哈希表中的一个条目与本应取消分配的区块的内存位置重叠为止。 由于哈希表保留了允许用户访问该地址的旧条目,因此管理程序最终允许用户修改哈希表条目! 因此,该漏洞利用修改条目来扩展对所有内存空间的访问权限。

虽然这个漏洞需要在OtherOS下运行的Linux环境,但它为进一步的逆向工程和研究项目迈出了一大步,因为黑客们现在可以研究系统中原本无法访问的关键区域了。 值得一提的是,在同一时间,索尼发布了删除OtherOS的3.21版软件更新。 你本以为这会阻止黑客继续他们的工作,但这只是给了他们更多加速工作的理由。

PS越狱

2010年晚些时候,一个名为“PS越狱”的组织宣布(随后发布)了一种独特的解决方案,无需篡改游戏机硬件,即可直接从游戏机的原生shell(XMB,在GameOS下)运行自制软件。 这一切都让索尼大失所望,他们很快就会采取法律手段阻止该产品的销售。

“PS 越狱”由一个USB加密狗组成,在游戏机打开之前将其插入前端的USB端口。 然后,用户必须按下电源按钮,不久后再按下弹出按钮。 如果指令执行成功,用户就会看到正常的XMB界面,但增加了一个“安装PKG”选项和几个自制应用程序,用于将蓝光游戏转储到硬盘,然后加载它们。

在幕后,这个加密狗执行着大量工作,可分为两组[90]

  1. USB漏洞:一旦游戏机打开,加密狗就会欺骗系统,让它以为自己连接到了一个6端口USB集线器,然后执行一连串复杂的USB命令,直到达到堆溢出并升级到PS3的内核(lv2)访问权限,接着它就会执行有效载荷。
  2. 有效载荷:这是另一个复杂的软件包,它对原始shell进行了修补,以启用仅在调试单元上可用的隐藏功能(即“安装PKG”条目)、禁用签名验证(加载任意模块/软件包)以及将蓝光命令重定向到硬盘驱动器(用于从硬盘驱动器加载游戏)。 这个程序能从内核层面改变这么多,让人不禁要问,管理程序到底有什么用?
    • 作为补充,M4j0r后来告诉我:“有趣的是,它甚至没有利用索尼的代码,lv2的这一部分是由罗技编写的,而该漏洞的开发者可能有机会获得源代码(由于2008年的黑客攻击)”。 [91]

随后,其他社区对该产品进行了逆向工程,不久之后,开源仿制产品(如 PS Groove)出现,取消了许多限制(例如,用户现在可以在漏洞利用完成后拔下设备)。 有些分支甚至被部署在德州仪器的计算器上[92]。 无论如何,索尼很快就通过软件更新3.42删除了这一金矿[93],尽管自制软件的大门已经打开。

荣誉奖

在介绍PS3自制软件领域的大奖之前,让我先向大家介绍几种同期开发的方法:

  • USB Jig:另一种U盘,这次的程序是诱使游戏机进入“出厂服务模式”(Factory Service Mode),该模式仅用于由授权人员对游戏机进行维修。 Jig中嵌入的程序复制了索尼提供给工程师的程序。 服务模式的主要优点是可以将游戏机降级为与PSJailbreak兼容的版本。 有效载荷还可以以PSP的自制程序的形式提供[94]。 索尼的应对措施是为服务模式打补丁,使其更难恢复到“正常”模式或更改固件,从而阻止用户使用服务模式。
  • 光盘模拟器(ODE):不同公司(Cobra、E3等)推出的一系列硬件产品。 这些产品不是篡改游戏机的固件,而是篡改蓝光的SATA/PATA接口。 ODE是位于主板和蓝光驱动器之间的电路板,它充当中间人的角色,欺骗游戏机,让它以为里面装的是一个有效的光盘游戏,其实它装载的是从外部USB驱动器上下载的光盘镜像。 在PS3的黑客历史中,有很长一段“不可破解期”,新游戏机没有可用的软件漏洞。 因此,ODE以高昂的价格填补了这一空白。
  • 固件降级器:由于索尼不断通过更多的软件更新来缓解漏洞,用户除了降级到可利用的固件外别无选择。 因此,出现了像E3这样的公司,他们提供的专业设备可以“强行”覆盖游戏机系统。 即直接烧录NAND或NOR芯片。 由于显而易见的原因,与基于USB的方法相比,这种方法需要更多的技巧和耐心。
  • 隔离泄漏(Isolated leaks):这是用于研究目的的漏洞,而不是用户能看到的“功能”(但对于进一步的开发也是必要的)。 总之,lv2ldr会解析撤销数据(用于将受损证书列入黑名单),到目前为止还顺利吗? 好吧,我们发现这个过程存在很多漏洞。 首先,由于某些无法解释的原因,撤销数据在用户区是可写的。 其次,解析器没有对获取的数据进行边界检查又来了)。 因此,黑客设法制作了可产生缓冲区溢出的自定义撤销数据,最终使他们能够在SPU的隔离模式下运行任意代码。 这样,黑客就可以访问机密数据(即密钥),而这些数据应该是受到保护,不受系统其他部分影响的[95]

加密技术的陨落

就像PSP的传奇一样,最初的漏洞需要耗费大量精力,而且很容易被索尼打上补丁,从而导致了一场不利的猫捉老鼠游戏。 然而,与PSP的情况一样,迟早会有发现打破该系统的基本安全:信任链。

2011年,George Hotz与fail0verflow团队一起公布了另一项突破,即索尼用于签署metldr执行的二进制文件的私有加密密钥。 在启动阶段加载的二进制文件使用ECDSA密钥签名。 作为一种非对称加密系统,这意味着拥有私钥的任何人(索尼,以及现在的_其他人_)都可以加密和签署二进制文件,因此,在metldr看来,这些二进制文件是“真实的”。 由于metldr是加载lv1(管理程序)之前的第三个启动阶段,这意味着黑客可以定制或开发他们自己的管理程序、内核及其下的任何东西。 此外,市场上的每台PlayStation 3都会认为定制的二进制文件是真实的。 总而言之,这是一个完全通过软件完成的潘多拉式漏洞。

这个密钥的发现本应在计算上是不可行的,但由于索尼在实现ECDSA算法时出现了被认为是“失误”的地方,它才得以实现。 长话短说,ECDSA算法的数学公式使用了一个随机值,而索尼在分发的所有更新文件中从未改变过这个随机值[96],这就把这个数字变成了一个常数,从而使其他变量的求解变得更加容易,这就是最终发生的事情。

下文将介绍这一发现的影响。

定制固件(CFW)时代

破解metldr意味着每个人都能为PS3创建“官方”系统,这导致大量GameOS“版本”涌现,不同社区制作了各种定制版本。 这些系统是对索尼官方固件文件(索尼以更新形式发布)的修改,并使用索尼泄露的密钥重新打包,因此可以在任何地方安装。 其结果被称为定制固件(CFW),并成为黑客入侵游戏机的事实方法,直到索尼采取强硬措施。

Image
打开“VSH菜单 ”的我的CFW。 这个变体(名为“Rebug”)还能让我把游戏机变成调试站(注意右下角的IP地址,你需要在调试器上输入它才能连接到运行中的进程),并摆弄我自己的自制软件。

在此期间,网络上出现了许多名称各异的CFW(如“Rebug”、“Ferrox”等),其中包含一些自定义功能,如[97]

还有我最喜欢的一种:带来testkit的调试功能,让任何零售游戏机都能成为调试站。 这可以通过安装具有调试功能的CFW来实现,也可以通过改变闪存中控制台特定数据,将零售游戏机(称为“CEX”)转换为调试模式(称为“DEX”)的 CFW 来实现。

索尼的强烈回应

与PSP发明CFW之后发生的事件类似,索尼也通过两次安全更新进行了报复:

软件方面,索尼发布了两个系统更新,增强了安全系统:

硬件方面,不仅后续的PS3型号(晚期的CECH-25xxx、CECH-3xxx和CECH-4xxx)预装了高于3.55的系统版本,而且它们还包含一个不同的bootldr/lv0ldr变体(称为lv0ldr.1),不仅能解密和加载lv0,还能获取一个名为lv0.2的新系统文件。 后者包含有关lv0的元数据[101],以确保lv0没有被篡改。 lv0.2使用新密钥签名(也不会被之前的ECDSA发现),从而防止黑客控制启动链。

时至今日,这些机型仍无法运行CFW,因此被昵称为_unhackables_。 不过,它们可以运行“混合固件”(HFW),我们稍后会详细讨论。

随着时间的推移,兼容CFW的游戏机越来越少。 因此,没有更新到3.55以上版本的PS3成了某种_遗物_。 与此同时,替代品的需求激增,如固件降级器(在旧机型上恢复到系统版本3.55)和ODE(在新机型上玩盗版游戏)。

自制软件的复兴

在错过安装CFW窗口的用户经历了漫长的等待期之后,2017年末,一个黑客团队发布了PS3Xploit,这是一个漏洞利用和实用程序集合[102],让用户无需昂贵的固件降级器(以及操作降级器的技能)就能在旧机型上安装CFW。

PS3Xploit的主要有效载荷完全通过软件复制硬件降级器的工作(修补CoreOS文件),其工作原理如下:

  1. 起点是基于WebKit的XMB互联网浏览器。 PS3Xploit使用JavaScript在系统用户空间(JavaScript环境之外)内执行任意代码。 要启动这个程序,用户只需打开XMB的本地网络浏览器,输入指向PS3Xploit主机的URL,然后让它开始工作。
  2. 内核提供的系统调用可以用来覆盖闪存中的操作系统文件。 此外,可视化Shell(XMB)及其插件还在内存中存储了使用这些调用的例程。
  3. 由于管理程序的“不执行”保护,PS3Xploit无法直接触发这些系统调用,从而无法在用户区加载新代码。 不过,它可以通过“借用”可视化Shell的例程来覆盖闪存。
  4. 因此,PS3Xploit会修改Webkit的执行堆栈,将执行重定向到可视化Shell的例程。 这种类型的技术(破坏堆栈以偏离内存中其他代码的执行)被称为面向返回编程(Return Oriented Programming,ROP),在信息安全领域非常流行。 缓解这种情况的一种方法是实施地址空间布局随机化(Address space layout randomisation,ASLR),这样就很难猜测例程(称为_小工具_)的位置,但正如你所猜测的那样,索尼的管理程序缺乏ASLR。
  5. 最后,这些系统调用是通过PS3Xploit的参数触发的,因此它们会用打了补丁的文件替换CoreOS文件(操作系统的第一部分,存储在闪存中)[103]
  6. 游戏机现在可以安装非官方软件更新,用户现在可以_利用这个机会_安装定制固件。 不过,它还不能降级系统版本,但一旦安装了最新的CFW,用户就可以安装进一步的实用程序来降级系统,并根据需要安装装备更好的CFW。

如你所见,这份_天赐的礼物_让定制固件再次成为关注的焦点,硬件降级器和ODE也随之过时。 另一方面,对于那些无论如何都无法安装CFW的设备(unhackables),该团队后来提供了PS3Hen,这是一个不同的漏洞利用程序包,重点是启用CFW功能的子集(包括执行自制软件的能力)。 这个软件包会将自己安装为XMB中的一个条目,用户必须在每次打开游戏机时运行它,才能重新启用自制应用程序的执行功能。

索尼的部分回应

幸运的是,索尼只采取了一小步来阻止PS3Xploit(也许是因为这一事件发生在PS3的后继机PlayStation 4上市多年之后)。 他们发布了一些系统更新,但并没有修复这个漏洞链,只是删除了Webkit中用于引导漏洞链的例程。 作为回应,黑客们发布了稍加修改的软件更新,恢复了这种入口(而且不知何故,它们不需要重新签名)[104]。 这些定制更新被称为混合固件(HFW),在本文撰写之时,它们已成为在unhackable机子上启用自制软件的事实选项。

至此,反盗版/自制软件的传奇故事告一段落。 依我之见,我不认为索尼有兴趣在这款游戏机上投入更多精力。 因此,我不指望在这一领域再有更多什么猫捉老鼠的游戏了。


这就是全部了,伙计们。

Image
两台PS3,一台在玩那个叫不出名字的游戏。
抛开到处是bug的游戏体验和不寻常的故事情节,我还挺喜欢这种类型的游戏。

你坚持到了最后!

公平地说,我原本计划把这个项目做成一个为期两个月的项目,但它变成了整个夏天的项目(你也看到了原因)。 无论如何,我希望这能帮助你扩大对这一系统的了解,让你理解那个时代技术进步背后的原因。 这样,你就可以超越_大众_不断重复的道听途说。

如果你想知道,在这篇文章中,我使用了三种型号的PS3:

虽然我反复强调Cell是一项划时代的技术,但你可能已经注意到,我并没有提到早期型号有多么不可靠。 这是我第一次听说游戏机只要玩一会儿游戏就会出故障。 的确,这些东西像恐龙一样吃电,像烤箱(还是个塑料烤箱)一样发热。 幸运的是,我当时用的是薄型机(它应该叫“工作机”)…… 真是个匆忙的时代,对吧?

总之,至于我接下来的日程,在开始下一篇文章之前,我自己会休息一段时间,这样我就可以在其他方面改进网站,并处理一些个人事务。

下篇文章见!
Rodrigo


参与贡献

这篇文章是 游戏主机架构 系列的一部分。如果您觉得我的文章很有趣,请考虑捐赠。您的资助将用于购买工具和资源,以帮助我提高现有文章和即将发表的文章的质量。

Donate with PayPal
Become a Patreon

你也可以购买英语版本的电子书。我会将获得的利润视为捐赠。

Image

特别感谢下列人员的捐助:

- Adam Obenauf
- Ben Morris
- Bitmap Bureau
- Brenden Kromhout
- Christopher Henderson
- Colin Szechy
- Daniel Cassidy
- David Portillo
- Dudeastic
- Elizabeth Parks
- eurasianwolf
- Grady Haynes
- Jaerder Sousa
- James Kilner
- James Knowler
- James William Jones
- Josh Enders
- Julius Hofmann
- Luke Wren
- Matthew Butch
- Nick T.
- Oleg Andreev
- Olivier Cahagne
- Payam Ghoreishi
- petey893
- Roger Bolsius
- Sanqui
- Stuart Hicks
- Thomas Finch
- Thomas Peter Berntsen

或者,您可以通过 建议更改添加翻译 来提供帮助。


Copyright and permissions

This work is licensed under a Creative Commons Attribution 4.0 International License. You may use it for your work at no cost, even for commercial purposes. But you have to respect the license and reference the article properly. Please take a look at the following guidelines and permissions:

Article information and referencing

For any referencing style, you can use the following information:

For instance, to use with BibTeX:

@misc{copetti-ps3,
    url = {https://www.copetti.org/zh-hans/writings/consoles/playstation-3/},
    title = {PlayStation 3 硬件架构 - 一份实证分析},
    author = {Rodrigo Copetti},
    year = {2021}
}

or a IEEE style citation:

[1]R. Copetti, "PlayStation 3 硬件架构 - 一份实证分析", Copetti.org, 2021. [Online]. Available: https://www.copetti.org/zh-hans/writings/consoles/playstation-3/. [Accessed: day- month- year].
Special use in multimedia (Youtube, Twitch, etc)

I only ask that you at least state the author’s name, the title of the article and the URL of the article, using any style of choice.

You don’t have to include all the information in the same place if it’s not feasible. For instance, if you use the article’s imagery in a Youtube video, you may state either the author’s name or URL of the article at the bottom of the image, and then include the complete reference in the video description. In other words, for any resource used from this website, let your viewers know where it originates from.

This is a very nice example because the channel shows this website directly and their viewers know where to find it. In fact, I was so impressed with their content and commentary that I gave them an interview 🙂.

Appreciated additions

If this article has significantly contributed to your work, I would appreciate it if you could dedicate an acknowledgement section, just like I do with the people and communities that helped me.

This is of course optional and beyond the requirements of the CC license, but I think it’s a nice detail that makes us, the random authors on the net, feel part of something bigger.

Third-party publishing

If you are interested in publishing this article on a third-party website, please get in touch.

If you have translated an article and wish to publish it on a third-party website, I tend to be open about it, but please contact me first.


来源 / 继续阅读

反盗版

奖励

CPU

游戏

图形

I/O

操作系统

影像


Rodrigo Copetti

Rodrigo Copetti

希望你能喜欢这篇文章!如果想了解本文作者的相关信息,点击这里 如果你想支持他,请点击这里

rsslinkedintwittergithub facebookreddit