MIPS CPU 如何掉电?

How does a MIPS CPU power down?

MIPS I 兼容 CPU 上的假设 OS 内核如何实际执行系统调用 10,从而停止所有执行并关闭电源?

长话短说:

我目前正在构建一个 MIPS 仿真器,它专门基于 MIPS I 架构规范;我已经(几乎)处理了它附带的整个 ISA,并在此过程中做出了一些深刻而有趣的发现。我还涉足特权资源,以及涉及系统协处理器 (COP0) 的任何内容。

我打算编写一个在特权上下文中处理 exceptions/syscalls/traps 的基本内核,主要是为了模拟系统调用是如何从内核模式的角度执行的;目前困扰我的是终止系统调用,代码 10。我希望找到一些(特权)指令来停止执行,就像 HLT 对 x86 所做的那样;然而,我能找到的最接近它的是 WAIT 指令。

WAIT实际上是为了将CPU切换到低功耗模式和等待中断而设计的,并且在ISA中找到,因此使得它也可以在用户模式下使用;没有终止执行的迹象,虽然我可以想出一些方法来制造它。

但是;我觉得我走错了路,MIPS 规范的 I-A、II-A 和 III 卷对我帮助不大了。换句话说:有人知道在执行系统调用 10 后真正的 MIPS CPU 中实际发生了什么吗?

syscall 10

Syscall 编号总是特定于操作系统:Linux 的 MIPS 版本使用与 SPIM 仿真器完全不同的系统调用编号。

出于这个原因,你最好不要谈论“syscall 10”,而应该谈论“syscall 10 in SPIM”(或任何OS 或您所说的模拟器)以避免误解。

How does a hypothetical OS kernel on a MIPS I compliant CPU actually implement a syscall 10 ...

首先:在“SPIM”模拟器上,“syscall 10”是exit,而不是shutdown

exit 不会关闭计算机,但会停止 multi-tasking OS 中的当前 运行 任务。 OS 只是释放当前任务的所有资源(例如,它将任务使用的内存标记为“空闲”)并且不再调度该任务。

所有其他任务(以及 OS 和 CPU)继续 运行。

... that does halt execution like HLT does ...

我不确定 HLT 真正 在现代 x86 CPU 上做了什么。在早期的 Intel CPUs 上,HLT 指令只是简单地跳回自身,直到发生中断。

这意味着CPU并没有执行一次HLT指令,而是一次又一次地执行该指令(就像死循环中的JMP指令一样)。

如果发生中断,则无限循环被打破(在HLT之后的下一条指令后继续执行);如果没有中断发生(这可以使用组合 CLI + HLT 强制执行),CPU 进入无限循环,但它不会断电。

... halting all execution, and power down?

这是shutdown:

CPU 个内核 通常 没有此功能; CPU 之外的某些硬件正在执行此操作。

就像所有其他硬件(键盘、屏幕、磁盘...)一样,使用 I/O 地址访问负责的硬件单元:

当连接到不支持特殊 I/O 地址 space 的 CPU 时(例如 x86 上的 INOUT 指令),"使用常规”(内存)地址。

假设电源单元在地址 0xF1234560 处连接到您的系统(仅作为示例),并且在向该地址写入值 0x789 时关闭电源。在这种情况下,以下顺序将关闭您的系统:

LUI a0, 0xF123
ORI a1, zero, 0x789
SW a1, 0x4560(a0)

并且因为这个硬件单元是在 CPU 之外找到的,所以你不会在 CPU 手册中找到任何关于它的信息。

当然,在使用相同 CPU 类型的不同类型的计算机中使用完全不同的工作方式的不同硬件单元! (所以没有“典型的MIPS电源单元”。)

在 1990 年代(当时大多数 MIPS 台式计算机已建成),系统根本无法通过软件关闭电源但屏幕上会打印一些消息(“请关闭计算机 ") 并且 CPU 只是进入无限循环...