如果我告诉你机器内一共有 四种操作系统, 你敢相信吗? 其中两个跑在 'Wii U' 模式, 而另外两个仅仅用于向后兼容.
由于这个话题可能会让人非常困惑,让我们从机器的 Wii U-only 系统开始.
随着年龄的推移,智慧也在逐渐显现。
就像最初在 Wii 中一样,Wii U同时运行两个操作系统,一个在 CPU (Espresso) 中,另一个在I/O处理器 (Starbuck) 中. 然而,两者都是用更大量的抽象层和更复杂的安全模型设计的. 因此,Wii U游戏其实不是直接裸机运行的.
Starbuck 改进版操作系统
首先,Starbuck 的操作系统现在被称为 IOSU (fail0verflow 给出的另一个名称,意思是 IOS + Wii U),你只能找到它的一个变体. 这意味着没有更多的 升级槽位,尽管有一种被称为 "IOSU255" 的替代版本 IOSU,它只在安装系统更新时加载.
IOSU 仍然由 多线程微内核 组成,该内核现在可以分配多达180个线程 (以前是100个),以及 驱动程序 和 模块,以负责I/O访问和安全.
一个有趣的方面是,Starbuck 使用了两个安全的内存块来加载其内核:其内部 96 KB 的 SRAM 和 3 MB 的 1T-SRAM (称为"MEM0") 来自 Wii GPU 部分. 这是出于性能和安全原因,因为它可以防止 Starbuck 被篡改并减少拥塞.
Espresso 的新操作系统
首先,Espresso 现在运行的是一个真正的操作系统. 而 Wii 游戏是在裸机上运行的,这是最明显的变化. 这被称为 Cafe OS,它由多个组件组成,不一定存储在同一介质中 :
- 一个 bootloader 用于引导系统.
- 一个 内核,它在硬件 (在本例中,通过 Starbuck) 和应用程序之间提供了一层抽象. 在启动的过程中,它在CPU的最高权限下运行,并提供许多底层功能 (内存管理、安全等). 奇怪的是,这个组件在中间核心 (核心1) 上运行,因为它提供了更多的缓存 .
- 用户端应用程序 运行在内核之上并为用户提供功能. 这包括交互式界面、游戏和安装的其他应用程序. 这包括交互式界面、游戏和安装的其他应用程序.
接下来,内核以 监管模式 运行,并使用 Wii 所依赖的相同 进程间通信 (IPC) 信道与 Starbuck 通信. 该组件可以在内存中加载多个程序 (进程),但它可以同时运行的进程数量非常有限 (尤其是在需要前台功能的情况下),我稍后会详细介绍.
Cafe OS 使用名为 "RPL" 的专有二进制格式加载系统和用户应用程序,该结构用于可执行文件和库. 此外,主要可执行文件被称为"RPX". Cafe OS 的一个应用程序 Loader 负责将它们加载到内存中 (与 IOSU 合作) 并执行它们. 此外 Loader 还执行 动态链接,将程序中 Cafe OS 的引用与控制台中安装的物理 Cafe OS 连接起来. 最后,应用程序以 "频道" 的形式安装,这些频道稍后会显示在 "系统菜单" (交互式界面) 中.
由于内核组织内存布局的方式,用户只能同时运行 最多两种类型的程序. 一个是可用内存最多的 "前台" 程序 (即游戏),另一个是分配内存明显较少的 "后台" 应用程序 (即网络浏览器). 用户可以在两者之间切换,而无需关闭任何一个,但一次只能显示一个,而且只能加载一个"前台"和一个"后台"应用程序. 否则,要么被关闭,要么被解除内存分配.
巨大的代价
是时候解决一些听起来有点离谱的问题了:Cafe OS的运行消耗了1GB,这是本该应用于游戏的 MEM2 的一半. 这意味着,Wii U拥有2 GB的DDR3,只向用户关心的最重要的应用程序授予1 GB.
虽然我的看法可能_不太专业_,但这真的很令人失望,尤其是考虑到像 Mac OS X 10.4 "Tiger" 这样的操作系统,它也运行在类似的 PowerPC CPU 上,提供了一组更复杂的功能,并且只要求最低256MB的 RAM. 即便如此,游戏机制造商倾向于在设计操作系统时尽可能减少占用空间,而任天堂这次似乎无法满足这一要求. 令人好奇的是,甚至有报道称,任天堂计划推出新版本的SDK和软件更新,以减少操作系统方面的内存消耗. 然而,新机来了,它的继任者已经在商店里了,而且看不到 Wii Us 的进一步进展. 那好吧!
尽管如此,还是有一个小小的妥协:"强制前台"应用程序可能会额外占用40 MB,只要它们正在显示 (也就是显示在前台). 然而,一旦用户切换到后台应用程序,该内存块就会自动解除分配. 这并不是一个"简单"的功能,而是由开发人员来找到好的用途.
保持传统
当玩Wii游戏时,一切都会改变,因为Wii U进入了一种被称为 'Virtual Wii' (vWii) 的状态. 这并不是模拟器,而是重新调整了硬件,使Wii游戏认为它们是在原始平台上运行的.
要进入 vWii 模式,Starbuck 执行一个名为 cafe2wii 的程序,该程序负责将主机转换为 Wii (也就是取消激活所有现代功能) . 现在,有不同的二进制文件集可供使用 (每个二进制文件都有cafe2wii的特别版本),特别是OSv0 和 OSv1. 选择取决于所需的vWii模式的类型. 总结起来就是:
- 正常 vWii 启动好的旧但好用的 系统菜单,这正是真正的wii在按下电源按钮后所做的. 这对于玩基于光盘的Wii游戏或启动任何安装的频道都很有用.
- HAI vWii 直接启动Wii游戏 (绕过系统菜单). 这是用于执行从虚拟控制台 (Virtual Console) 商店购买的Wii游戏. 因此,Wii 游戏可以安装在 Wii U 的专用存储器 (eMMC 或外部 USB) 中.
幸运的是,并不是所有 vWii 模式下的现代硬件都被浪费了,因为 GamePad 也可以变成一个带控制器的镜像屏幕. 如果这还不够的话,GamePad的正面包含红外线灯,可以充当传感器条,所以 Wii 遥控器手柄根本不需要电视.
就像任何具有向后兼容性的任天堂游戏机一样,一旦进入 Wii 模式,唯一的方法就是重新启动游戏机.
存储介质
Wii 毫不避讳地提供了以多媒体为中心的存储选项 (SD 卡是一个不错的补充). 因此,Wii U就是以此为基础的.
话虽如此,现在还是让我们看看这个控制台中有哪些存储选项:
引导 ROMs

在这个复杂的封装中,有两个隐藏的只读存储器(ROM),以普通形式储存启动代码。
第六代产品巩固了视频游戏机中操作系统的概念. 然而,该设备仍然暴露在将现成组件与内部组件相结合所导致的漏洞中. 由于主机制造商无法定制第三方芯片的设计,定制的安全组件必须位于主板内的不同位置,从而面临篡改和逆向工程的风险.
在第7代产品中,IBM推出了一系列新的 PowerPC CPU,在硅中嵌入了一个隐藏的掩模 ROM. 这使得 PlayStation 3 和 Xbox 360 能够以简单的形式存储敏感代码 (因为CPU只能理解未加密的代码),而不用担心被黑客读取. 话虽如此,现在轮到 Wii U 了,所以IBM也为此做好了准备:在 Espresso 内部,有一个隐藏的 16KB ROM 连接到其中一个核心. 这被用作 Espresso 的第一个启动阶段,一旦执行,它将确保后续的二进制文件得到任天堂的批准.
再加上 Starbuck 自己的 4 KB 引导 ROM (继承自以前的Wii型号),你就有两个CPU在启动时强制执行任天堂的安全代码.
机密 ROMs
任天堂还添加了其他 ROM 散布在 Latte 周围,其中包含 非常敏感 的信息.
第一个是 1 KB 的一次性可编程 (OTP) 存储器,其中存储了许多加密密钥。 这种内存也可以在 Wii 上找到,但尺寸较小 (128字节). OTP 存储用于加密/解密数据和验证现有数据完整性的信息. 它还存储用于启用/禁用主板的低级别功能的标志 (比如 JTAG 调试). 此外,OTP 在 Espresso 的 bank 和Starbuck的 bank 之间是分开的,因为两者都需要读取不同的密钥,然后在不同的时间点锁定 OTP 访问.
第二个是 512 字节的 SPI EEPROM(SEEPROM),它是可写的 (尽管不是所有的都经过编辑),并包含许多配置标志和其他元数据 . SEEPROM 中的一些数据是用 OTP 存储器中的密钥加密的.
分散的 NAND
在讨论了系统的底层部分之后,让我们现在来看一下"可见"部分的存储位置. 主板上有两个存储空间:
首先, 我们有 1 GB of NAND 被分成两个 banks:
其次,8 GB 或 32 GB 的 eMMC(取决于购买的型号)仅可用于用户数据(下载的游戏、DLC和游戏更新). 请记住,这可能还包括从虚拟控制台 (Virtual Console) 商店下载的Wii游戏(只能从Wii U的系统菜单启动).
存储扩展

为了可以在 Wii U 上工作, 一般将外置硬盘连接到 USB Y 型电缆.
对于那些空间很快用完的用户,Wii U提供了开箱即用的 外部USB存储 支持. 然而,唯一的限制是,介质必须使用 Wii U 的专有文件系统进行格式化,并且只能存储用户数据. 顺便说一句,Wii U 的 USB 端口只能输出高达 500mA 的电流 ,具有讽刺意味的是,这对于一般的 USB 硬盘(约900mA)来说是不够的. 因此,用户不得不使用 USB Y 电缆来组合两个 USB 端口的电流.
接下来,还有一个 SD卡插槽,但这只能被某些存储多媒体文件(如图像)的程序和游戏所利用. 幸运的是,它支持 FAT32,因此不需要格式化.
启动流程
有两个独立的 CPU 可能很难初始化. 尽管如此,任天堂对这种做法并不陌生. 那么,Wii U是如何协调 Espresso 和 Starbuck 的,从而使控制台最终在安全的环境上运行交互式界面的呢? 让我们看看.
多核混沌 (Multicore chaos)
在我们开始之前,我想解决其他对称架构(如xbox 360)上存在的 相同的问题:对称内核必须协调,这样每个内核就不会同时接管系统. 好吧,Espresso采用了与x86类似的做法,在x86中,只有一个内核在打开CPU时被激活. 然后,由主内核中的程序加载来唤醒另外两个 .
尽管如此,所有内核都包含相同的重置向量 (vector). 因此,程序负责询问自己从哪种类型运行,然后根据答案继续运行. 这种操作方式类似于 ARMv7.
启动流程
是时候来看启动程序了,我先告诉你,它并不是特别简单. 毕竟,它是两块有独特安全模型并且完全独立的处理器,正在以一种有序的方式启动,这就需要进行许多协调. 为了你们能听得懂,我的总结会尽量简化,以避免向你们提供大量信息. 所以,如果你想要了解更多,请不要忘记查看引用的文章.
另一方面,你不需要完全理解这个问题才能看文章的其余部分. 如果不是您感兴趣的领域,请随时可以跳过!
好吧,让我们开始吧。 一旦用户按电源按钮,将发生以下事件:
- Starbuck 被唤醒并进行到...
- 执行在其重置矢量 (vector) 中找到的代码(
0xFFFF0000) , 它指向它的掩码 ROM (其中第一个启动阶段是,boot0). 第一个例行 (routine) 让 Starbuck 将boot0复制到Starbuck的SRAM, 所以它运行得更快. boot0然后通过读取 OTP 内存和 SEEPROM 上的标志(flags)来初始化部分 I/O 和附近的区块。 然后从 NAND 中获取下一个引导步骤 (boot1)。boot1已经被加密和签名,因此 Starbuck 首先检查其签名 (RSA 类型) 以及内容的完整性(比较 SHA-1 哈希校验值) 然后开始解密它 (使用 AES)。 所有需要的密钥和证书都是从 OTP 内存中提取的。- 更多I/O 的初始化完成后。 然后,SEEPROM 和部分 OTP 将被锁定无法再次访问。 最后,
boot1部分的初始化就暂告一个段落。 boot1初始化更多 I/O 并准备使用 MEM2 和 MEM0 。 然后从 NAND 读取IOSU 固件到MEM1 并执行相同的验证 & 解密过程。 如果一切顺利,Starbuck 会禁用使用过的 OTP 内存,并完全清除敏感数据。 最后,它将转到IOSU 固件。IOSU 固件是一堆程序的集合。 首次启动的是IOSU Loader,它加载了剩下的其他固件(像是IOSU)到特定的内存位置(SRAM 和 MEM0)。 然后它从MEM1中清除自己,跳到了在IOSU 内核等待的 SRAM。IOSU 内核首先快速进行 MEM1 检查 , 一旦完成后, Starbuck 会运行在 IOSU。 为了能正常执行功能,IOSU 的相关模块可以在 MEM0 上找到。- Espresso 是下一个,所以IOSU 将
Cafe OS(加密形式) 复制到 MEM2 并启动 Espresso。
- 执行在其重置矢量 (vector) 中找到的代码(
- Espresso 的第一个核心启动后...
- 重置矢量(vector)处于地址
0x00000100, 此处被 Boot ROM 占用, 所以它开始在那里执行. - MMU, L1/L2 缓存和注册表被清除。 然后,Espresso 切换到"翻译模式"(激活 虚拟内存)。
- 通过篡改锁定的 L1 缓存和空内存写入,BootROM 被复制到 L1(为了更快地运行),而不会到达外部 RAM。
- 重置向量(reset vector)变成一个无限循环(以阻止试图重置 的 CPU)。
- OTP 的 AES 密钥已复制到 L1。 然后,OTP 被禁用。
Cafe OS 内核的 header 已复制到L1,其签名使用存储的密钥进行验证。Cafe OS 内核的数据通过使用 DMA 将数据散列和解密,以区块的方式来回发送到 L1 缓存。- 现在未加密的
Cafe OS 内核在 RAM 中映射完毕并准备执行。 L1 和 L2 已被刷新;启动 ROM 已被禁用。 最后,跳转执行Cafe OS 内核。 - Espresso,正在运行
Cafe OS 内核,检查用于指引它启动系统菜单应用程序的配置文件。 系统菜单是从 NAND 到 MEM2 并像其他加密的程序一样处理的。 如果一切正常,系统菜单将被启动。
- 重置矢量(vector)处于地址
- 用户现在将可以控制主机了!
vWii 启动流程
一旦 Wii 图标启动,系统将进入一个 "额外" 加载阶段,将 Wii U 变成一个 Wii。 这个过程开始于 Starbuck 执行 cafe2wii, 然后到 :
- 重启 Espresso.
- 将 Espresso 降频并禁用两个额外的核心。
- 上传用于 DMCU 视频编码器的固件。
- 将 旧字体 上传到 MEM1 的区域 它们可以从 EXI 接口访问(为了创建 旧的 EXI 路由)。
- 启用 AHCI 接口上的兼容模式(即连接到SATA 光盘驱动器的接口),以便可以使用旧的 光盘接口 (DI) 协议来命令它。
- 将 OTP 内存中的密钥复制到其内置的 SRAM,因为 vWii 会认为内部的 SRAM 是 传统的 SEEPROM。
- 禁用 Wii U-exclusive I/O,但 GamePad 除外 (除非它被用户或游戏停用)。
- 启动 IOS。 IOS 槽 的选择取决于使用哪种 vWii 模式,如果在 HAI 模式中,则取决于游戏。
- 为vWii设计的 IOS 软件包已经略有改动,增加了一些模块。 这包括
DI2SD来模拟光盘驱动器和OHCI1将来自GamePad 的输入转换成蓝牙命令 (以此来使用 Wii 手柄)。
- 为vWii设计的 IOS 软件包已经略有改动,增加了一些模块。 这包括
- 上传
Wii 系统菜单或NAND 启动程序(运行Wii 图标的二进制文件) 到 MEM2, 选择取决于使用的 vWii 模式。- 由于 Espresso 将从 启动ROM 起就启动,它只能使用 Wii U 的安全模型接收二进制。 因此,Wii 的相关程序都进行了修改以进行兼容。
- 启动 Espresso,让它处理并运行指定的二进制文件。
- 用户现在将又可以控制主机了!
交互界面
Wii U的图形用户界面叫做 系统菜单 (或'Wii U Menu') 正如你以前看到的那样,它是一个在 Cafe OS 完成加载后立即启动的应用程序。
Wii U提供的大多数服务(例如: 光盘游戏启动器、设置、在线商店等等)以前台应用程序的形式出现,用户可以从系统菜单中选择其中任何一个。 在另一边, 一组小的功能 (如 网页浏览器) 已作为后台应用程序实现,并且只能从"主页"菜单中启动。

从GamePad上看到的系统菜单,显示了安装的传统网格'频道'(应用程序) 。

主菜单可以在两个屏幕同时显示. 当用户在 GamePad 上按下 'Home' 按钮后显示.
系统菜单界面是针对触摸屏设计的。 尽管它的主要控制器是 GamePad, 它还支持指向交互屏幕(如Wii 那样)。
在其他新闻上,Miis (任天堂的 签名头像) 也被移植到 Wii U。 看起来并没有很多游戏,但是有许多系统应用程序使用Miis (主要用于装饰目的)。

虽然看起来不像,但这是从电视上看到的Web浏览器应用程序(实际浏览发生在GamePad上)。
在任天堂所有家庭游戏机中,GUI 第一次是多用户的。 因此要求用户在首次启动时设置一个 系统帐户 (类似于 索尼 和 微软 的主机)。

系统菜单也在电视上显示信息. 展示了一个住满 Mii 小人的小镇, 他们还会对你说一些随机的小提示. 最初,Miiverse 服务还在运行时,该屏幕也展示来自 Miiverse的用户界面的消息.
在亲身体验过 GUI 后,我惊讶于它缓慢的运行速度。 总体来说不是缓慢的,但在应用程序之间切换 (必要且经常发生) 需要相当长的时间。 这可能是由于安全模式到位缓慢(请回忆 Espresso 和 Starbuck binaries 的引导过程),因为 每一次 都需要运行。 此外,Espresso似乎对已执行的算法并不特别快(将在"反盗版/自制软件"部分解释安全模型)。
传统的 shell
系统菜单有一个叫做 Wii 模式 的特定应用程序。 这是启动 旧的系统菜单 来游玩 Wii 游戏的程序。 在背后,这个应用会启动之前说到的 cafe2wii 程序,并且我们已经知道了这种方法是如何运作的。

在进入 vWii 模式之前,系统会询问用户是否要保持 GamePad 为使用状态(作为输入设备和镜像屏幕).
一旦进入了 vWii 模式,它的 主菜单 将也能更改主机的相关设置(如 Wii 手柄的配对信息和其他设置)。 因此,为了避免与 Wii U 本地配置发生冲突,IOSU 的内核模块负责事先同步两个设置 。

vWii 模式中的 Wii 系统菜单. 除了已安装的三个新频道(与Wii U有关)和其他已移除的频道之外,差别不大. 请看视频编码器产生的细小黑边,它试图将原始的480p图像适配到720p/1080p信号中。
vWii 模式不一定需要电视。 如果用户选择激活 GamePad 显示,GamePad 将会变为一个显示器, 传感器条和 "经典控制器" (Wii 时期的可选配件)。 然而,最后一个功能仅适用于从eShop购买的 Wii 游戏(虚拟控制台的一部分)。

启用GamePad的vWii模式后,请注意我的相机捕捉到GamePad发出的两个红外线灯。
任天堂还在 vWii 中加入了新的 Wii U 相关频道,以使用户的体验更加舒适。

新的"Wii系统传输"频道可以通过网络将旧Wii的用户数据(包括Wii Shop购买记录和点数) 导入到Wii U上,但同时也会将旧Wii恢复到出厂设置状态。(令人担忧)

新的"返回Wii U"频道,顾名思义,通过重置控制台将其恢复为Wii U模式。
最后,系统菜单上的设置按钮只允许管理保存数据 (出于实际原因,已移除"Wii 系统设置"屏幕)。
可更新性
这两个操作系统都有很强的"可更新" 性,由任天堂在线发布软件更新或者通过游戏光盘。 在这样做时,除了改进软件或修补系统的漏洞外,还可以支持新的附件。
当更新器启动时,Starlet 会加载一个叫做"IOSU255"的特别 IOSU,然后从那里安装更新 。 更新包可以同时包含 Wii U 和 vWii 模式的更新。






