与PS1和Saturn相似,N64游戏是为裸机编写的。 但是,没有可用的BIOS调用来简化某些操作。 作为替代,游戏嵌入了小型操作系统,它提供了大量的抽象层来有效处理CPU、GPU和I/O。
这不是我们最初想象的传统 桌面操作系统,它只是一个占据最小空间的微内核,提供以下功能:
- 使用消息传递的多线程(不要忘记CPU是单核的)。
- 调度和抢占。
- 简化的寄存器和I/O访问。
总而言之,这些功能对于组织需要同时工作的音频、视频和游戏逻辑任务至关重要。
内核通过使用任天堂的库自动嵌入。 此外,如果程序员决定不包含其中一个库,内核的相应部分将被剥离,以避免卡带空间被浪费。
启动过程
与以前的卡带系统不同, Nintendo 64 遵循复杂的引导过程,在实际游戏运行之前准备好所有硬件。 用户一打开主机就执行此操作,这与基于CD的同时代产品捆绑BIOS或IPL非常相似。
这些例程也称为初始程序加载(IPL),工作方式如下 :
- 用户打开主机。
- PIF-NUS (主板上的一个单独芯片) 将主CPU置于无限重置状态,直到PIF-NUS验证游戏卡带中的CIC芯片。
- PIF-NUS和CIC芯片将在I/O和反盗版部分分别进一步介绍。
- 如果验证进程成功完成,CPU将在
0xBFC00000处开始运行。 此地址指向PIF-NUS的一个内部ROM ,准确来说是名为IPL1的第一个引导阶段。 - IPL1初始化部分硬件(CPU寄存器、并行接口和RCP),并将下一阶段(IPL2)从内部ROM复制到RSP的内存,以加快执行速度。 然后,它将执行重定向到那里。
- IPL2 将游戏 ROM 的前一兆字节复制到 RSP 内存中,验证它(使用 PIF)并执行它。 这一部分包含下一个启动阶段,名为 IPL3。
- IPL3初始化RDRAM和CPU缓存。 然后,它启动操作系统(即虚拟内存和异常向量),设置程序状态(即堆栈指针),最后继续调用游戏的启动例程。
由于IPL3位于游戏卡带中,并非每个游戏都捆绑了相同的代码。 据推测,这些变体与在卡带中捆绑的CIC芯片变体有关。