Game Boy Advance 架构:实践分析
Game Boy Advance 架构
Rodrigo Copetti 的实践分析
如果你使用辅助工具或旧版浏览器,请切换到“经典”版本。
🇬🇧 - English🇵🇱 - Polski🇪🇸 - Español🇨🇳 - 简体字🇷🇺 - Русский👋 - 添加翻译eBook edition
本文也已发布在许多数字书店中,以方便电子书读者。新版本无 DRM,可以离线阅读,并且更新速度与网站同步。
你可以在 Amazon Kindle, Apple Books, Kobo 和 其他商店 找到该电子书。 这些利润将用于改进当前文章和开发未来文章。
更多信息请点击这里。
目录
支持图像
模型
最初的 Game Boy Advance。于 2001 年 3 月 21 日在日本发布,2001 年 6 月 11 日在美国发布,2001 年 6 月 22 日在欧洲发布。
主板
显示修订版“03”的主板。 请注意,“AGB”是 Game Boy Advance 型号的标识符。卡带插槽和音频放大器位于背面。
标记了重要部件的主板
图表
主要架构图。每个数据总线都标有其宽度。所示的 AGB Game Pak 的布局不包括 mapper(因为新的 CPU 能够寻址更多的内存),尽管具有大型 ROM 的游戏可能仍然捆绑了一个。
简介
Game Boy Advance 的内部设计对于一款使用两节 AA 电池供电的便携式游戏机来说非常令人印象深刻。
这款游戏机将继续使用 Nintendo 的 标志性 GPU。 此外,它将引入一家英国公司相对较新的 CPU,该公司将在未来几年内 surge in popularity。
CPU
大多数组件组合成一个名为 CPU AGB 的单个封装。 此封装包含两个完全不同的 CPU:
- 一个 Sharp SM83 ,以 8.4 或 4.2 MHz 运行: 如果它不是在 Game Boy 上发现的同一个 CPU! 它有效地用于运行 Game Boy (DMG) 和 Game Boy Color (CGB) 游戏。 如果您想了解更多关于这些游戏机的信息,请参阅 我之前的文章。
- 一个 ARM7TDMI ,以 16.78 MHz 运行:这是我们将重点关注的新处理器,它最肯定运行 Game Boy Advance 游戏。
请注意,这两个 CPU 永远不会同时运行 或进行任何奇特的协同处理。 包括 非常 旧的 Sharp 的 唯一 原因是为了 向后兼容。
话虽如此,在我描述 ARM 芯片之前,我发现从这种 CPU 品牌背后的历史开始会很方便。
剑桥的奇迹
关于 ARM CPU 的起源及其随后名声鹊起的故事引人入胜。 在这里,我们发现公共投资、指数级增长、命运不佳的决策和长途合作的结合。
Acorn Computers 的崛起
带有 5¼ 磁盘盒的 BBC Micro 照片 [1],第一张磁盘是 Elite。
70 年代末对于英国民众来说是一个动荡的时期。 曾经在战后理想下建立的干预主义经济已经达到了它的进程,钟摆很快转向了自由市场改革。 在这场风暴中,位于剑桥的 Acorn Computers 以及 Sinclair 等公司正在向实验室和爱好者销售计算机套件。 与美国和日本企业类似,Acorn 的计算机依赖于 6502 CPU 和专有的 BASIC 方言。
进入 80 年代,新英国政府内的部长级利益导致创建了一个项目,以提高学校的计算机素养 [2]。 感谢 Acorn 即将推出的“Proton”家用电脑,该公司获得了构建一款经济实惠的计算机的合同,该计算机符合政府的愿景。 结果就是 BBC Micro (绰号“Beeb”),在学校、教师和学生中享有显著的成功。 在 Micro 中,Acorn 纳入了一个前卫的 “Tube”接口 ,该接口可以使用 第二个处理器 扩展计算机。 这将为 Acorn 的下一个重大投资铺平道路。
在开发他们的下一个产品时,这次以企业为中心,Acorn 没有找到合适的 CPU 来取代 6502。 与日本和美国竞争的创新压力,加上不幸的规划,使 Acorn 陷入了困境。 因此,Acorn 的一个新部门的任务是生产一个引人注目的 CPU。 为了解决 Acorn 最近的限制,CPU 团队将其架构基于一篇名为 The Case for the Reduced Instruction Set Computer [3] 及其原型 RISC CPU [4] 的研究论文的教义。 最后,在 1985 年,Acorn 交付了 ARM1 CPU 作为 BBC Micro 的 Tube 模块,但仅用于研发目的进行销售。 直到 1987 年,随着第一台 Acorn Archimedes 计算机的推出,ARM 芯片(当时是 ARM2 CPU)才开始发挥核心作用。
« 上一个 下一个 »
一个新的 CPU 冒险
在 Acorn Archimedes 商业化期间,Apple 被 Acorn 的节能 CPU 所吸引,但这家美国公司仍然不相信 Acorn 最新的 ARM3 适用于 Apple 新的宠物项目 Newton。 然而,双方并没有走开(毕竟,Acorn 是一个竞争对手),而是讨论了改进 ARM3 以满足 Apple 需求的可能性 [5],即 灵活的时钟频率 、 集成 MMU 和 完整的 32 位寻址。
这种合作很快变成了一种伙伴关系,Acorn、Apple 和 VLSI (ARM 芯片制造商) 成立了一家新公司,专门致力于开发 ARM CPU。 Apple 提供了投资(获得 43% 的股份),Acorn 分享了其员工,VLSI 负责制造。 1990 年, Advanced RISC Machines (ARM) Ltd 成立,Robin Saxby 担任其执行董事长。
几年后,Apple 终于推出了由 ARM610 驱动的 Newton MessagePad ,ARM610 是下一代集成 Apple 输入的 ARM 芯片之一。 与此同时,Acorn 还发布了使用新 CPU 的 RiscPC。
现在,当 Acorn 和 Apple 在计算机/手持设备市场上徘徊时,ARM 设计了一种激进的商业模式。 为了远离制造业,Saxby 的愿景包括以 CPU 设计 及其 指令集 的形式 许可 ARM 的知识产权 [6]。 这使 ARM 的客户范围超出了计算机领域,例如 Texas Instruments [7],后者随后将该公司与新兴的移动市场(最终以 Nokia 6110 告终)和机顶盒联系起来。 在接下来的几年里,ARM 的技术将被捆绑到数十亿台移动设备中 [8]。
« 上一个 下一个 »
Nintendo 的合作
回到日本,感谢 Game Boy 分析,我们了解到 Nintendo 的便携式系统硬件策略倾向于 片上系统 (SoC) 模型。 这使得该公司能够混淆经济实惠的现成技术,并将其与内部开发相结合。 这样,新的游戏机就可以变得独一无二且具有竞争力。
CPU AGB,装有 ARM7TDMI CPU(以及许多其他组件)。
幸运的是,ARM 的许可模式非常适合这些需求。 自 1994 年以来(在 Virtual Boy 发布前一年),两家公司一直在进行谈判,尽管直到多年以后才实现任何实质性的成果 [9]。 原因很简单:日本人发现 ARM 的代码密度和对 32 条数据线的需求不可行( Virtual Boy 的 CPU 已经设法摆脱了这种情况)。 然而,ARM 的新 CPU 设计师 - Dave Jaggar - 迅速用 ARM7TDMI 回答,这是一款新的 CPU,专注于在功耗和存储限制下最大化性能。 这对 ARM 来说是一个转折点 ,因为这款新产品不仅让 Nintendo 满意,还引起了 Texas Instruments 、 Nokia 以及手机领域其他竞争对手的关注。
毫不奇怪,当 Nintendo 开始开发 Game Boy Color 的继任者时,他们的 CPU 选择变成了 ARM7TDMI。
ARM7TDMI
现在让我们深入了解一下这款芯片提供的功能。
指挥 CPU
首先,ARM7TDMI 实现了 ARMv4 指令集,它是 ARMv3 的继任者。 这意味着:
- 基于 RISC 的设计:如前所述,ARM CPU 受加利福尼亚大学伯克利分校的一篇名为“The Case for the Reduced Instruction Set Computer”的论文的影响 [10]。 它的研究概述了一系列用于可扩展处理器设计的指导方针,并捍卫了 load-store 架构、固定指令大小和大型寄存器文件的使用。 这些在人口众多的 CPU 市场上大多不存在(即 Intel 8086、 MOS 6502、 Zilog Z80 和 Motorola 68000),但会影响整个 80 年代和 90 年代新 CPU 系列的设计。
- 条件执行:ARM ISA 的一个特殊功能。 本质上,几乎每条指令都嵌入一个条件,说明是否应该执行它。 通常,其他 CPU 遵循“比较和跳转”过程(也称为“分支”)来控制 CPU 必须执行哪些指令。 相比之下,ARM 程序员可以在指令本身中插入条件。 这是可能的,因为 ARM 操作码的前四个位保留给条件(即
equal
、not equal
等)。 总而言之,这降低了 ARM 代码的复杂性,因为条件执行为例程提供了更简洁的设计,这与分支和子例程拆分不同。 此外,这也可以作为 控制危害 的解决方法(稍后会详细解释)。 - 一个 灵活的第二个操作数 ,也称为“Operand2” [11]。 通常,操作由两个操作数组成(例如
add 2 and 2
)。 但是,ARM 指令还允许将额外的shift
操作嵌入到第二个操作数中。 例如,您可以在一条指令中计算将 2 移动 4 位,然后将其加到 2
。- 位移也是执行 2 的幂的除法或乘法的廉价快捷方式,这导致了许多优化技术。
- 32 位 和 64 位乘法 指令:ARM v4 的一个附加功能。 此外,64 位操作会在两个寄存器中输出结果。
封装
现在我们知道了开发人员如何与此芯片通信,让我们检查一下硅内部的情况。
内核
在电路方面,ARM7TDMI 是 ARM710 的一个精简版本,具有有趣的附加功能。 该内核包括 [12] [13]:
- 16 个通用 32 位寄存器:虽然与 SM83/Game Boy 的七个 8 位寄存器 相比,这是一个很大的进步,但这是 RISC 指南的一个折衷方案,该指南要求使用三十二个 32 位寄存器。 这是因为 ARM 倾向于保持较小的硅片尺寸 [14]。
- 32 位数据总线和 ALU:这意味着它可以移动和操作 32 位值,而无需消耗额外的周期。
- 简洁的 32 位寻址:这是 Apple 输入的一部分。 前三个 ARM CPU 使用 26 位内存地址来优化性能(组合的程序计数器和状态寄存器可以容纳在单个 32 位字中),以换取内存寻址能力(最多可以访问 64 MB 的内存)。 后续的 ARM6 系列(及其 ARMv3 ISA)实现了 32 位寻址逻辑,但保留了旧代码的向后兼容模式。 现在,ARM7TDMI(专注于移动设备)放弃了 26 位模式,仅容纳 32 位地址的逻辑(减少了所需的硅量)。
- 没有 内存管理单元 (MMU):自 ARM1 以来,ARM 提供了一个 MMU 解决方案。 首先是“MEMC”协处理器,然后与 ARM610 集成。 现在,ARM7TDMI 似乎是其系列中唯一一个没有提供 MMU 的处理器,这可能是由于缺乏兴趣(早期的移动设备不需要复杂的虚拟内存)。
- 没有缓存:此芯片的另一个成本降低,因为以前的 ARM 芯片捆绑了一些缓存。
最后,所有这些都可以使用 3 伏 电源供电 [15]。 这是迈向移动计算的明显一步,因为早期的内核需要 5 V 电源。
« 上一个 下一个 »
流水线
自从第一次迭代以来,ARM 已经实现了一个 三级流水线 来运行代码。 换句话说,指令的执行被分成三个步骤或 阶段。 CPU 将同时获取、解码和执行多达三条指令。 这可以最大限度地利用 CPU 的资源(从而减少空闲硅),同时还可以增加每单位时间执行的指令数量。
像两个非常 相似 同时代产品 一样,ARM CPU 容易受到 数据危害 的影响。 然而,程序员和编译器都不会注意到这一点,因为在这种情况下,CPU 会在需要时自动暂停流水线。
控制危害 也存在,但 ARM 使用一种称为 条件取消 的有效方法来解决它们:每当分支指令处于第二阶段 (Decode
) 时,CPU 都会计算分支的条件 [16]。 根据结果,如果必须执行分支,CPU 将自动取消后续指令(将其变成填充符)。 现在,与 MIPS 的方法 相比,这可能看起来效率不高(因为 MIPS 编译器可以插入有用的指令,而不仅仅是填充符)。 因此,除了分支之外,ARM 还提供 条件执行。 后者将此流水线设计变成了一个优势,因为 ARM 可以解码一条指令并在同一阶段计算其嵌入的条件。 因此,在这种情况下,不会添加填充符。 这就是在为 ARM CPU 编程时,条件执行优先于分支的原因 [17]。
榨取性能
load-store 架构的一个缺点是导致 ARM 的代码非常 稀疏。 像 x86 这样的竞争对手可以使用更少的代码来执行相同的任务,从而减少了存储需求。 因此,当 Nintendo 考察 ARM 的最新设计 ARM7 时,他们并不满意。 ARM 指令的大小意味着假设的小工具由具有有限内存和存储的 16 位总线组成 - 所有这些都是为了节省成本和能源 - 会使 CPU 效率低下并受到瓶颈。 幸运的是,Dave Jaggar 刚刚完成了 ARM7 的设计,并且不会轻易放弃。 在与 Nintendo 会面后的通勤途中,他提出了一个解决方案: Thumb 指令集 [18]。
Thumb 是 ARM 指令集的一个子集,其指令被编码为 16 位字(而不是 32 位)[[