大量的 CPU 最终影响了整个操作系统的复杂度。 不仅如此,这台主机中还包含了多个不同的系统。 这种设计作为主机运行不同服务的机制(例如: 对 NDSi、NDS、GBA 的向下兼容、恢复模式等)。
因此,为了避免本节变得更加混乱,我们一步步来。
架构
一台 3DS 主机中包含了四个固件:
- NATIVE_FIRM:使主机以"原生"的模式运行(可以使用 3DS 中独有的功能)。 此处,ARM11 用于运行主要的程序。
- 有趣的是,主机上存在两份 NATIVE_FIRM 实例(分别称为 FIRM0 和 FIRM1),以防止第一份固件由于某些原因受损。
- 该固件通常也被称为 "Horizon"。
- TWL_FIRM:使 3DS 以 NDSi 模式运行。 这确实会禁用 3DS 中独有的功能,但考虑到 CPU、GPU、音效和 I/O 的相互关联,TWL_FIRM 确实是一件艺术品。 因此,ARM9 和 ARM7 会被置于前台(它们运行主要的程序)。
- "TWL"来自 NDSi 的内部代号。
- AGB_FIRM:类似 TWL_FIRM,使 3DS 以 GBA 模式运行。 此处,ARM7 用于运行主要的程序。
- SAFE_FIRM:用于维护相关任务,如系统更新等。 该固件基本上是一个早期版本的 NATIVE_FIRM (在旧款 3DS 上不超过版本
3.0,New 3DS 上不超过版本8.1)。
所有的固件都包含了分别用于 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 是一个实现了如下服务的用户空间程序:
- 与 ARM11 的通信,称为"PXI"。
- 加密相关函数。 包含 AES、RSA、SHA 和 ECDSA。
- I/O 管理。
- 文件系统。
- Title(3DS 软件)验证和安装。
内核和 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 上会运行多个用户空间进程,并通过它们提供服务,例如:
- 与 ARM9 的通信,称为"PXI"。
- 多核心处理。
- 网络、HTTP 和 SSL。
- 与任天堂在线基础设施的连接。
- 图形界面(称为"HOME 菜单")。
- 启动应用程序的能力。
- 一个名为"服务"的应用程序抽象层,游戏必须调用这些服务才能访问硬件资源。 尽管一些组件如 GPU 通过一层非常薄的 API 作为接口。
- 此外,服务是分层实现的。 游戏只访问这些服务的一部分,而后者则调用更高权限和专门化的服务。
ARM11 的内核位于专用的 512KB SRAM 上 ,这块内存也被称为"AXI Work RAM"或"AXI WRAM",因为它与 ARM11 使用 AXI 协议连接。
强制行为
现在来说坏消息,NATIVE_FIRM还对用户程序施加了不同寻常的限制。

结合两个操作系统后,运行NATIVE_FIRM的任天堂3DS的权限级别概览。
首先,ARM11 的调度器硬编码了每个核心的行为(而不是将各个核心均视为通用处理单元):
- 第一个核心称为 appcore,用于运行游戏。 但其使用 FIFO(即先进先出)的线程调度策略,这意味着多线程使用不当时游戏可能会发生死锁 。
- 第二个核心称为 syscore,用于运行系统相关任务。
例外地,syscore 可以将其执行时间的 30% 借给用户应用程序,这可能有助于降低一些操作的负载,尽管并非所有例程都可以在 syscore 下工作(尤其是时间敏感的操作)。
这种限制在 New 3DS 中进一步扩展,其 ARM11 MPCore 现在配备了四个核心,其中:
- 第四个MP11核心专门用于面部追踪。 任天堂的工程师没有增加电路,而是通过纯软件实现了面部追踪。 因此,他们保留了一个 MP11 核心用于这个功能。 我猜这是任天堂的一种低成本解决方案。
- 第三个MP11核心大部分时间处于空闲状态。 这是因为,默认情况下,调度程序未编程为在此处调度线程。 游戏元数据确实包含一个标志,可以启用第三个核心上的线程调度,尽管到目前为止,其采用仅在《异度之刃3D》(顺便说一句,这是新3DS独占游戏)中得到证实。 可能在某个时候,任天堂考虑过更无缝的方法,但最终发现由于电池消耗问题,以及可能与针对任一设置优化的游戏兼容性问题,该方法不可行。
- 考虑到新任天堂2DS XL是"新"型变体,但没有立体屏幕,这意味着,在大多数情况下,其四核CPU的一半被浪费了!
- CDMA,新的 DMA 单元,仅在主机启动时可用 。 启动过程结束后,CDMA 将不会再次被使用。
接下来,对于游戏中可用的内存,我们已经知道旧款 3DS 和 New 3DS 分别配备了 128MB 和 256MB 的 FCRAM。 现在你需要知道的是对于应用来说,相应的可用内存分别只有 64 MB 和 124 MB 。 这意味着系统占用掉了主机约 50% 的内存,这并不是一个特别令人愉快的特性! 为了缓解这种情况,游戏可以在它们的元数据中设置一个标志(称为 APPMEMTYPE)向系统请求更多的 FCRAM,分别为 96 MB 和 176 MB。 在幕后,该标志指示系统重新启动主机并在不预先启动HOME菜单的情况下启动游戏,从而在此过程中节省内存。
综合来看,你现在可以感受到新3DS中并非所有额外的硬件都会自动意味着更快的软件。 这很遗憾,也让我觉得新3DS从软件角度来看是一个仓促的产品。 但公平地说,任天堂从未计划将"新"3DS作为原始3DS的完全继任者。 "新"品牌显然是为了重振3DS系列,考虑到销量数字至少可以说不尽如人意。
存储介质
现在我们了解了操作系统的设计方式,接下来看看数据在这款主机中是如何存储的以及存储在哪里。
引导 ROMs
遵循其悠久的祖先Game Boy,SoC存储了一系列未加密的ROM,其中包含用于启动NATIVE_FIRM的程序 。 这些引导程序被称为Boot9和Boot11;分别由ARM9和ARM11执行。 同样,出于安全原因,它们在物理和虚拟上都保持隐藏。 举个例子,Boot9存储了AES解密密钥,这些密钥不能随意放置。
有趣的是,Boot9的代码显示它不仅仅能够从eMMC NAND引导NATIVE_FIRM。 然而,由于某些例程具有硬编码目录和额外的安全层,Boot ROM最终只能加载eMMC NAND中的NATIVE_FIRM固件。
此外,虽然随着新3DS的到来,多个组件发生了变化,但BootROMs却丝毫未变 。
OTP内存
为了进一步提高安全级别,主机将一系列主机独有的信息存储在一次性可编程(OTP)内存中 。 与Wii和Wii U类似,这些信息也包括加密密钥。
OTP在制造过程中写入一次,因此每个主机之间的密钥都不同。 因此,一个被破解的主机不一定会危及其他主机。 考虑到某些先前的实现包含全局密钥,这对于掌机来说是一个重要的里程碑。
eMMC NAND
在大型SoC旁边,有一个eMMC NAND闪存芯片。 然而,其尺寸因制造商而异 。 例如,东芝提供了943MB和1888MB的芯片,而三星则提供了954MB和1240MB的芯片。
为了解决这种差异,任天堂使用一个通用尺寸定义了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核心,并实现一个引导加载程序,使所有核心协调一致,然后执行必要的功能以使主机运行起来。
启动流程
是时候深入了解引导过程了。 与同代任何其他主机一样,安全性至关重要,这将对引导阶段产生影响。 为了避免本节过于冗长,我简化了安全系统设置的阶段,但你会在"反盗版"部分找到更多信息。
话虽如此,一旦主机通电,将发生以下事件序列 :
- ARM9和ARM11通电。
- ARM9的复位向量位于地址
0xFFFF0000,指向Boot9。 ARM11被无限复位,直到其复位引脚被抬起。 - Boot9清除ARM11的复位引脚,然后初始化ARM9的MPU。
ARM11 MPCore现在将并行开始执行Boot11:
- ARM11的复位向量位于地址
0x00000000,恰好与Boot11位于同一位置。 - Boot11将根据其执行的核心进行分支。 如果大于核心2,则无限挂起。
- 等待ARM9完成固件引导。
同时,ARM9将忙于继续执行Boot9:
- AES和RSA公钥被导出到AES和RSA引擎(这将在"反盗版"部分解释)。
- Boot9将尝试从NAND引导。
- 在NAND中,位置
0x0处有一个名为"NCSD头"的分区,它声明有八个分区,每个分区都有一个固件可供引导。 - 对于列出的每个固件分区,Boot9将获取其头,验证SHA-256哈希和RSA-2048签名(使用先前从BootROM加载的一组密钥),并重复此过程直到一个验证成功。然后,它将从那里引导。 然后,它将从那里引导。
- 在NAND中,位置
- 如果NAND中的所有验证都失败,Boot9将尝试从Wi-Fi模块中的闪存引导。 如果这也失败,主机将显示错误屏幕。
- 第一个验证成功的分区恰好包含NATIVE_FIRM。 Boot9将根据头的参数将固件复制到不同的内存区域。
- 禁用Boot9和Boot11的一半。这样做,FCRAM将变得可访问。 这样做,FCRAM将变得可访问。
- 将ARM9和ARM11的执行重定向到固件的入口点。
现在NATIVE_FIRM已引导:
- ARM9将:
- 加载Kernel9。
- Kernel9隐藏OTP内存并加载Process9。
- ARM9 CPU现在已启动并运行Process9。
- 同时ARM11执行以下操作:
- 加载Kernel11。
- 在New 3DS的情况下,Kernel11将写入一个名为
CFG11_BOOTROM_OVERLAY_CNT的新寄存器,以覆盖Boot11代码 。 这将允许将新ARM11核心(核心3和核心4)的执行从Boot11重定向到Kernel11中的任意函数,从而控制它们。 - Kernel11将启动各种系统进程,包括PM(进程管理器)。
- PM将启动"NS"(任天堂用户界面Shell)系统模块。
- NS将启动游戏或HOME菜单应用程序。
- 现在由用户控制。
备用启动过程
前面所有的解释都集中在启动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相机、立体视角和增强现实)。 与智能手机竞争的压力再明显不过了。

HOME菜单,安装了一些应用程序。 这次我还插入了马里奥大陆的游戏卡带。
在用户界面设计方面,我倾向于认为它借鉴了Wii系统菜单的许多模式,但移植到了双屏便携系统上。 HOME菜单(交互式界面的名称)使用1页导航系统,其中每个已安装的应用程序都显示在一个可滚动的网格上。 除了这里和那里的一些快捷方式,每个服务都是一个要启动的应用程序。
现在,作为任天堂的产品,你可以期待它特别注重创造力和对细节的关注。 家庭是目标受众,然而,成年人是付费者,任天堂深知这一点。
保持一致性
NS模块不仅负责启动交互式界面,它还为3DS软件提供了调用例程来处理某些交互的能力。 一个例子是"返回HOME菜单"叠加层,每当用户按下"HOME"按钮时都必须显示。

用户可以在游戏中按下"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,由系统更新程序负责此过程 。


