« 3DS 的架构 (index)

3DS 的架构

Chapter 9: 操作系统


目录

  1. 架构
    1. 安全处理器
    2. 用户处理器
    3. 强制行为
  2. 存储介质
    1. 引导 ROMs
    2. OTP内存
    3. eMMC NAND
    4. SD/microSD
  3. 启动过程
    1. 多核混乱
    2. 启动流程
    3. 备用启动过程
  4. 交互界面
    1. 保持一致性
    2. 传统的 shell
    3. 可更新性

大量的 CPU 最终影响了整个操作系统的复杂度。 不仅如此,这台主机中还包含了多个不同的系统。 这种设计作为主机运行不同服务的机制(例如: 对 NDSi、NDS、GBA 的向下兼容、恢复模式等)。

因此,为了避免本节变得更加混乱,我们一步步来。

架构

一台 3DS 主机中包含了四个固件:

所有的固件都包含了分别用于 ARM11、ARM9 和 ARM7 CPU 的二进制文件。 唯一的例外是 ARM7 在 NATIVE_FIRM 和 SAFE_FIRM 下不会被启用。

通常而言,3DS 首先会启动一个 Boot ROM,然后引导 NATIVE_FIRM。 在这之后,正在运行的操作系统可能会基于用户的操作重启至不同的固件(例如,游玩 NDS 游戏或者进入主机更新画面)。

现在让我们看看每个 CPU 在 NATIVE_FIRM 模式下的行为。

安全处理器

当 NATIVE_FIRM 启动后,ARM9 运行自己的操作系统,该系统包含名为 Kernel9 的内核和名为 Process9 的单个程序 。

Kernel9 的设计遵循 微内核 模型,也就是说它只提供了对硬件的必要抽象,包括:

另一方面,Process9 是一个实现了如下服务的用户空间程序:

内核和 Process9 位于仅限 ARM9 访问的 1MB(New 3DS 中为 1.5MB)SRAM 上。

在安全性方面,Kernel9 和 Process9 之间没有权限区分,因为后者可以无条件访问一个系统调用,该调用可以在内核模式下运行任意代码。

总结来说,ARM9 除了连接到主机的 I/O 之外,也承担了 安全处理器 的职责,就像 Wii 和 Wii U 的 ARM9 那样,并与 NDS 中第二 CPU 仅用于负责 I/O 和音频任务的 协处理器 架构不同。

用户处理器

相应地,ARM11 上也运行了内核(称为 Kernel11),其架构与 ARM9 上的内核架构相似。 两者的区别在于,ARM11 上会运行多个用户空间进程,并通过它们提供服务,例如:

ARM11 的内核位于专用的 512KB SRAM 上 ,这块内存也被称为"AXI Work RAM"或"AXI WRAM",因为它与 ARM11 使用 AXI 协议连接。

强制行为

现在来说坏消息,NATIVE_FIRM还对用户程序施加了不同寻常的限制。

Image
结合两个操作系统后,运行NATIVE_FIRM的任天堂3DS的权限级别概览。

首先,ARM11 的调度器硬编码了每个核心的行为(而不是将各个核心均视为通用处理单元):

例外地,syscore 可以将其执行时间的 30% 借给用户应用程序,这可能有助于降低一些操作的负载,尽管并非所有例程都可以在 syscore 下工作(尤其是时间敏感的操作)。

这种限制在 New 3DS 中进一步扩展,其 ARM11 MPCore 现在配备了四个核心,其中:

接下来,对于游戏中可用的内存,我们已经知道旧款 3DS 和 New 3DS 分别配备了 128MB 和 256MB 的 FCRAM。 现在你需要知道的是对于应用来说,相应的可用内存分别只有 64 MB124 MB 。 这意味着系统占用掉了主机约 50% 的内存,这并不是一个特别令人愉快的特性! 为了缓解这种情况,游戏可以在它们的元数据中设置一个标志(称为 APPMEMTYPE)向系统请求更多的 FCRAM,分别为 96 MB176 MB。 在幕后,该标志指示系统重新启动主机并在不预先启动HOME菜单的情况下启动游戏,从而在此过程中节省内存。

综合来看,你现在可以感受到新3DS中并非所有额外的硬件都会自动意味着更快的软件。 这很遗憾,也让我觉得新3DS从软件角度来看是一个仓促的产品。 但公平地说,任天堂从未计划将"新"3DS作为原始3DS的完全继任者。 "新"品牌显然是为了重振3DS系列,考虑到销量数字至少可以说不尽如人意。

存储介质

现在我们了解了操作系统的设计方式,接下来看看数据在这款主机中是如何存储的以及存储在哪里。

引导 ROMs

遵循其悠久的祖先Game Boy,SoC存储了一系列未加密的ROM,其中包含用于启动NATIVE_FIRM的程序 。 这些引导程序被称为Boot9Boot11;分别由ARM9和ARM11执行。 同样,出于安全原因,它们在物理和虚拟上都保持隐藏。 举个例子,Boot9存储了AES解密密钥,这些密钥不能随意放置。

有趣的是,Boot9的代码显示它不仅仅能够从eMMC NAND引导NATIVE_FIRM。 然而,由于某些例程具有硬编码目录和额外的安全层,Boot ROM最终只能加载eMMC NAND中的NATIVE_FIRM固件。

此外,虽然随着新3DS的到来,多个组件发生了变化,但BootROMs却丝毫未变 。

OTP内存

为了进一步提高安全级别,主机将一系列主机独有的信息存储在一次性可编程(OTP)内存中 。 与WiiWii U类似,这些信息也包括加密密钥。

OTP在制造过程中写入一次,因此每个主机之间的密钥都不同。 因此,一个被破解的主机不一定会危及其他主机。 考虑到某些先前的实现包含全局密钥,这对于掌机来说是一个重要的里程碑。

eMMC NAND

Image
初版3DS上的三星制造eMMC芯片。

在大型SoC旁边,有一个eMMC NAND闪存芯片。 然而,其尺寸因制造商而异 。 例如,东芝提供了943MB1888MB的芯片,而三星则提供了954MB1240MB的芯片。

为了解决这种差异,任天堂使用一个通用尺寸定义了3DS分区表:旧3DS为943MB(东芝尺寸),新3DS为1240MB(三星尺寸)。 因此,如果你的主机配备了更大的eMMC芯片,额外的空间不幸地被闲置了。

无论如何,主机依靠eMMC存储其系统数据,包括多个固件,以及用户数据(3DS和DSi模式下的存档和配置)。

SD/microSD

曾经是可选(有时是象征性)介质的SD卡,现在享有与内部存储类似的职责,因为3DS依赖它从eShop下载软件并存储用户数据(游戏存档、相机照片和麦克风录音)。

此处存储的软件和用户数据受AES-128-CTR加密保护。

启动过程

现在我们了解了操作系统的结构以及数据的存储位置,接下来看看任天堂3DS如何从一个闪亮的关机砖块变成一个提供多种服务的可操作主机。

多核混乱

考虑到3DS必须在其SoC中管理四个处理器(2核ARM11 + ARM9 + ARM7)——如果看新3DS,则是六个——人们不禁会想,这些"中央"处理器在主机启动期间是如何突然变得异常协调的。 嗯,这都归结于实现主从层次结构。

对于ARM9和ARM7,没有太多疑问,两者可以单独供电并加载不同的二进制文件。 因此,挑战主要集中在传播同质多核ARM11上。

在ARM11 MPCore集群中,所有核心都从0x00000000向量开始执行。 然而,CP15(系统控制协处理器)提供了一个名为CPU ID的寄存器,除其他功能外,它用于识别当前正在执行指令的核心。 因此,程序员可以查询此寄存器来决定当前CPU核心是应该发出命令(主)还是等待命令(从)。 ARM后来通过提供一个名为mpidr的专用寄存器(在ARMv7 CPU中找到)改进了这项技术。

得益于此,任天堂工程师能够识别3DS集群中的任何CPU核心,并实现一个引导加载程序,使所有核心协调一致,然后执行必要的功能以使主机运行起来。

启动流程

是时候深入了解引导过程了。 与同代任何其他主机一样,安全性至关重要,这将对引导阶段产生影响。 为了避免本节过于冗长,我简化了安全系统设置的阶段,但你会在"反盗版"部分找到更多信息。

话虽如此,一旦主机通电,将发生以下事件序列 :

  1. ARM9和ARM11通电。
  2. ARM9的复位向量位于地址0xFFFF0000,指向Boot9。 ARM11被无限复位,直到其复位引脚被抬起。
  3. Boot9清除ARM11的复位引脚,然后初始化ARM9的MPU。

ARM11 MPCore现在将并行开始执行Boot11:

  1. ARM11的复位向量位于地址0x00000000,恰好与Boot11位于同一位置。
  2. Boot11将根据其执行的核心进行分支。 如果大于核心2,则无限挂起。
  3. 等待ARM9完成固件引导。

同时,ARM9将忙于继续执行Boot9:

  1. AES和RSA公钥被导出到AES和RSA引擎(这将在"反盗版"部分解释)。
  2. Boot9将尝试从NAND引导。
    1. 在NAND中,位置0x0处有一个名为"NCSD头"的分区,它声明有八个分区,每个分区都有一个固件可供引导。
    2. 对于列出的每个固件分区,Boot9将获取其头,验证SHA-256哈希和RSA-2048签名(使用先前从BootROM加载的一组密钥),并重复此过程直到一个验证成功。然后,它将从那里引导。 然后,它将从那里引导。
  3. 如果NAND中的所有验证都失败,Boot9将尝试从Wi-Fi模块中的闪存引导。 如果这也失败,主机将显示错误屏幕。
  4. 第一个验证成功的分区恰好包含NATIVE_FIRM。 Boot9将根据头的参数将固件复制到不同的内存区域。
  5. 禁用Boot9和Boot11的一半。这样做,FCRAM将变得可访问。 这样做,FCRAM将变得可访问。
  6. 将ARM9和ARM11的执行重定向到固件的入口点。

现在NATIVE_FIRM已引导:

  1. ARM9将:
    1. 加载Kernel9。
    2. Kernel9隐藏OTP内存并加载Process9。
    3. ARM9 CPU现在已启动并运行Process9。
  2. 同时ARM11执行以下操作:
    1. 加载Kernel11。
    2. 在New 3DS的情况下,Kernel11将写入一个名为CFG11_BOOTROM_OVERLAY_CNT的新寄存器,以覆盖Boot11代码 。 这将允许将新ARM11核心(核心3和核心4)的执行从Boot11重定向到Kernel11中的任意函数,从而控制它们。
    3. Kernel11将启动各种系统进程,包括PM(进程管理器)。
    4. PM将启动"NS"(任天堂用户界面Shell)系统模块。
    5. NS将启动游戏或HOME菜单应用程序。
    6. 现在由用户控制。

备用启动过程

前面所有的解释都集中在启动NATIVE_FIRM上,这导致了传统的原生3DS模式。 对于TWL_FIRM、AGB_FIRM和SAFE_FIRM等其他固件,情况则复杂一些。 事实证明,之前的启动过程仍然是必需的,因为只有NATIVE_FIRM可以从电源循环启动。 但是一旦NATIVE_FIRM运行起来,它就可以引导这些固件中的任何一个,并且每个固件都会以不同的方式编程ARM9。 无论哪种情况,在Boot9期间设置的安全机制仍然会生效。

特别是TWL_FIRM和AGB_FIRM,它们操作一组特殊的寄存器,根据DS、DSi或GBA游戏所期望的硬件和内存布局来塑造3DS硬件。 FCRAM仍然可以访问,允许从这些位置(除了NTR卡槽)引导游戏ROM。 然而,FCRAM将被重新配置以遵循DS和GBA总线规范(16位宽,而不是32位)。

关于向下兼容固件的一个重大区别是,ARM7最终将处于活动状态(因为任天堂DSi/DS和GBA软件需要它)。

要退出任一模式,非原生固件包含一个重新启动系统的例程,从而使其返回NATIVE_FIRM。 因此,回到3DS模式。

交互界面

第七代主机界面已登陆任天堂3DS。 一个明显的迹象是用户不再需要零售游戏来充分利用他们的主机,只需浏览界面,你就会发现捆绑了许多应用程序和服务。 这包括这款主机的特殊功能(3D相机、立体视角和增强现实)。 与智能手机竞争的压力再明显不过了。

Image
HOME菜单,安装了一些应用程序。 这次我还插入了马里奥大陆的游戏卡带。

Image
Wii的"Miis"已进入3DS。

Image
设置应用程序。

在用户界面设计方面,我倾向于认为它借鉴了Wii系统菜单的许多模式,但移植到了双屏便携系统上。 HOME菜单(交互式界面的名称)使用1页导航系统,其中每个已安装的应用程序都显示在一个可滚动的网格上。 除了这里和那里的一些快捷方式,每个服务都是一个要启动的应用程序。

现在,作为任天堂的产品,你可以期待它特别注重创造力和对细节的关注。 家庭是目标受众,然而,成年人是付费者,任天堂深知这一点。

保持一致性

NS模块不仅负责启动交互式界面,它还为3DS软件提供了调用例程来处理某些交互的能力。 一个例子是"返回HOME菜单"叠加层,每当用户按下"HOME"按钮时都必须显示。

Image
用户可以在游戏中按下"HOME"按钮,这将重新显示HOME菜单而不会关闭当前应用程序。 此事件由正在运行的应用程序处理,但例程由NS服务提供。

此外,3DS软件还可以调用"迷你应用程序"来处理其他事件(例如显示虚拟键盘),这些被称为Applets

这两组都是所有应用程序的关键依赖项,因为它们负责一致地对外部事件做出正确反应。 有趣的是,由于Applets和NS例程不属于游戏本身,在New 3DS系统中,即使游戏在兼容模式下运行(即所有"新"硬件都已禁用),它们仍将使用全部硬件执行,为未优化的3DS游戏提供小幅性能提升。

传统的 shell

虽然特殊固件包含了DS/GBA游戏所期望的旧BIOS例程,但并没有DS或DSi界面。

旧的Wi-Fi设置屏幕(由DSi和DS游戏调用)是唯一的例外。 有趣的是,虽然原始DS Wi-Fi设置无用(因为它们只能连接到WEP保护的接入点),但DSi的对应设置(从DSi和"DSi增强型"DS游戏访问)可以更改3DS的Wi-Fi设置。 然而,这些游戏捆绑了一个只适用于真实DSi的旧Wi-Fi驱动程序(3DS包含Atheros AR6014,而DSi配备Atheros AR6002或AR6013)。 因此,为了解决这个问题,当固件启动时,两个Wi-Fi设置会自动同步。

可更新性

当然,一个可更新的系统几乎是必需的,不仅是为了提供新功能,也是出于安全考虑。

你可以通过在线或游戏卡带更新系统软件。 令人困惑的是,两者都包含不同的更新包。 游戏卡带只捆绑了系统更新,不包含更新后的用户应用程序,而网络更新则包含所有内容 。 因此,版本名称会编码两者的混合,以防用户使用了两种渠道。

要安装更新,NS服务会重启到SAFE_FIRM,由系统更新程序负责此过程 。


Previous: 8. I/O

Next: 10. 游戏


Rodrigo Copetti © 2026 RSS Feed

切换至现代版

主页 · 文章 · 支持 · 关于作者 · 关于此网站