计算机如何自动重启?关机后,如何通知自己重新启动?什么样的软件可以做到这一点?
答案1
总结:计算机中的电源状态由 ACPI(高级配置和电源接口)的实现控制。在关机过程结束时,操作系统会设置 ACPI 命令,指示计算机应重新启动。作为响应,主板使用各自的重置命令或线路重置所有组件,然后执行引导过程。主板实际上从未关闭,它只重置各种组件,然后表现得好像刚刚按下了电源按钮一样。
冗长而散漫但(在我看来)更有趣的答案:
软实力及其运作方式
在过去(好吧,对于像我这样的大学生来说,90 年代已经是很久以前的事情了),我们有 AT(先进技术)主板,AT 电源管理。AT 电源系统非常非常简单。计算机上的电源按钮是一个硬件开关(可能在机箱背面),120vac 输入直接通过它。它物理地打开和关闭电源,当此开关处于关闭位置时,计算机中的所有东西都完全没电(这使得 CMOS 电池非常重要,因为没有它就没有电源来保持硬件时钟滴答作响)。因为电源开关是一种物理机制,所以没有软件方法来打开和关闭电源。Windows 会显示著名的“现在可以安全关闭计算机”消息,因为尽管一切都已停止并准备关闭,但操作系统无法真正翻转电源开关。这种配置有时被称为硬实力,因为它们都是硬件。
如今情况已经不同了,因为有了 ATX 主板和ATX电源(如果你一直在关注的话,那就是 Advanced Technology eXtended)。除了其他一些进步(比如 mini-DIN PS/2,有人知道吗?),ATX 还带来了软实力。软电源意味着计算机的电源可以由软件控制。这带来了一些重要的变化:
- 待机电源:您可能在电源引脚排列中看到过标有“5v SB”或“5v 待机”连接器。备用电源是一条 5v 线,连接到主板,即使计算机关闭,也始终处于开启状态。这就是为什么在维修现代计算机时,拔下或关闭 PSU 硬开关(如果有)非常重要,因为即使关闭,您也可能会短路 5v SB 并损坏主板。这也是 CMOS 电池不再那么重要的原因 - 只要电源有主电源,就会使用 5v SB 来替换 CMOS 电池,因此只有在完全拔下计算机电源时才会使用 CMOS 电池。重要的是,5v SB 线允许计算机的组件(最重要的是 BIOS 和网络适配器)在计算机关闭时继续运行一些简单的软件。
- 智能电源控制。如果你查看电源主板 (P1) 连接器的引脚排列,你会注意到两个引脚通常标记为开启和电源接通。这些代表“电源开启”和“电源就绪”。如果您喜欢尝试,请取一个不在计算机中的电源,将其插入,并小心地将接地线(黑线之一)短接至 PS_ON 线(绿线)。电源将明显打开,风扇开始旋转。由 +5v SB 供电的主板组件实际上是通过将电源连接到 PS_ON 引脚来打开和关闭电源。由于电源中的一些电容器和其他组件需要一段时间才能充电,因此电源主输出的电压在 PSU 打开后可能不会立即稳定。这就是 PS_RDY 引脚的用途,当电源的内部逻辑确定电源“就绪”并将提供稳定的电源时,它会亮起。主板等到 PS_RDY 亮起后才能继续启动。
因此,您的电源开关不再“打开”计算机。相反,它连接到主板的基本控制器,这些控制器检测到按钮已被按下并执行一系列步骤来准备系统,包括点亮 PS_ON 以便电源可用。电源按钮不是触发启动过程的唯一方式,扩展总线上的设备也可以这样做。这很重要,因为您的以太网网络适配器实际上在计算机关闭时保持打开状态并寻找一个非常具体的数据包,通常称为“魔术数据包”。如果他们检测到这个数据包的地址是他们的 MAC 地址,他们就会触发启动过程。这就是“局域网唤醒”(WoL) 的工作原理。时钟也可以启动启动(大多数 BIOS 允许您设置计算机每天启动的时间),USB 和 FireWire 设备可以触发启动,尽管我不知道有任何实现这一点。
了解电源控制
好吧,我解释软实力,一方面是因为我觉得它很有趣(这一直是我解释事情的一个关键原因),另一方面是因为它能让你理解你的电脑的电源和运行/关闭状态是如何由软件控制的。在大多数当前的计算机中,这个软件系统是高级配置和电源接口 (ACPI)。ACPI 是一个标准化、统一的系统,允许软件控制计算机的电源系统。您可能听说过ACPI 电源状态。电源控制的基本机制是这些“电源状态”,您的操作系统通过准备切换(电源实际关闭之前发生的关机/休眠过程)来切换电源模式,然后命令主板切换电源状态。电源状态如下所示:
- G0:工作(计算机的“开启”状态)
- G1:睡眠(计算机的待机状态,分为 S 个子状态)
- S1:CPU 和 RAM 保持供电,但 CPU 未执行指令。外围设备已关闭。
- S2:CPU 关闭,RAM 维护
- S3:除 RAM 和会触发恢复的设备(键盘)外,所有组件均关闭。当您告诉操作系统“休眠”时,它将停止进程,然后进入此模式。
- S4:休眠。所有设备都关闭。当您告诉操作系统进入休眠模式时,它会停止进程,将 RAM 的内容保存到磁盘,然后进入此模式。
- G2:软关机。这是计算机的“关闭”状态。除可以触发启动的设备外,所有设备的电源均关闭。
- G3:机械关闭。
重置实际上是如何发生的
您会注意到,重新启动不属于这些状态之一。那么,当您的计算机重新启动时,实际上会发生什么?答案可能令人惊讶,因为从电源管理的角度来看,它几乎没有。 有ACPI 重置命令。当您告诉操作系统重新启动时,它会遵循其正常的关机过程(停止所有进程、执行一些维护、卸载文件系统等),然后作为最后一步,它不会将机器发送到电源状态 G2(就像您只是告诉它关机一样),而是设置重置命令。这通常被称为“重置寄存器”,因为与大多数 ACPI 接口一样,它只是一个地址,应向其中写入特定值以请求重置。我将引用 2.0 规范来说明它的作用:
可选的 ACPI 重置机制指定了一种提供完整系统重置的标准机制。实施后,此机制必须重置整个系统。这包括处理器、核心逻辑、所有总线和所有外围设备。从 OSPM 的角度来看,断言重置机制在逻辑上等同于对机器进行电源循环。在重置后获得控制权后,OSPM 将以类似于冷启动的方式执行操作。
因此,当设置复位寄存器时,会按顺序发生一些事情。
- 所有逻辑都重置。这意味着向各种硬件发送相应的重置命令,包括 CPU、内存控制器、外设控制器等。在大多数情况下,这仅仅意味着点亮物理 RST 线,正如 AndrejaKo 所描述的那样。
- 然后计算机启动。这是“以类似冷启动的方式执行操作”部分。主板执行的步骤与按下电源按钮后电源刚刚准备就绪时执行的步骤相同。
这两个步骤(实际上可以分解为更多步骤)的最终效果是,它看起来就像计算机刚刚启动一样,但实际上电源一直处于打开状态。这意味着关闭和启动所需的时间更少(因为您不必等待电源准备就绪),并且重要的是允许通过关闭操作系统来启动启动。这意味着不需要使用另一个启动触发器(WoL 等),并且当您没有办法触发启动时,您可以使用重新启动作为远程重置系统的有效方法。
回答得有点长。不过,希望你现在对计算机电源管理有了更多的了解。我确实在研究这个方面学到了一些东西。
答案2
这是一个起点:
芯片通常不会关闭然后打开。相反,有一条复位线,当所有内存都被清除并且处理器看起来就像刚刚通电时,它将使处理器处于所谓的复位状态。当该引脚保持高电平(或低电平,取决于处理器)时,处理器处于复位状态。一旦释放该引脚,它将继续正常启动,就像第一次打开一样。这样做的重点是本身没有断电。
那么,这如何扩展到现代 PC 等大型系统?现代计算机是由计算机组成的,而计算机有时又由计算机本身组成。因此,当您将计算机设置为重置时,制造计算机的“计算机”将开始保存其状态(如果重置受到控制),或者只是拔出其重置引脚。
一些处理器和微控制器(它们是微型独立计算机,通常比现代台式计算机落后 20 年)可以使用内部开关自行重置。正如我所说,一旦产生重置的信号消失,计算机就会启动。因此,问题中的前提并不完全正确。计算机不知道何时开机。它知道何时需要“关闭”或重置,并且当保持它在那里的信号消失时,它就会打开。
这种行为在现代计算机上可能看起来很奇怪,因为现代计算机可以设置为在特定时间或通过网络等方式打开。正如我所说,计算机是由计算机组成的。因此,虽然主处理器可能处于关闭状态,但内部可能还有许多其他芯片和微控制器处于打开状态。最明显的例子是实时时钟,它通常由电池供电。然后它可以打开其他芯片,这些芯片将打开其他芯片,连锁反应一直持续到整个计算机打开。在今天的计算机上,有一条称为 +5 VDC 待机电压的 PSU 线。它为计算机“关闭”时打开的各种设备提供约 50 mW 的功率。
一些琐事:英特尔 386 EX 处理器上的重置引脚是引脚号 110。
在 Intel i7-900 上,它的土地编号是 AL39。
我希望有人能够提供一个答案,从高层次的角度解释事情是如何运作的,因为这是一个相当复杂的系统。
答案3
这篇博文描述 Linux 如何触发重启。
摘抄:
Linux 有很多种重置 x86 的方法。其中一些仅适用于 32 位,所以我将忽略它们,因为老实说,你这辈子都在干什么。而且,它们很糟糕。所以,剩下五种方法。
kbd - 通过键盘控制器重新启动。最初的 IBM PC 将 CPU 重置线连接到键盘控制器。写入适当的魔法值会使线路产生脉冲,机器将重置。这一切都非常简单,除了现代机器没有键盘控制器(它们实际上是嵌入式控制器的一部分),甚至更现代的机器甚至不假装有键盘控制器。现在,嵌入式控制器运行软件。众所周知,软件很糟糕。但更糟糕的是,嵌入式控制器上的软件是由 BIOS 作者编写的。因此,很明显,任何假装这曾经有效的说法都是某种精心编造的虚构。有些机器对硬件是否处于 Windows 编程的确切状态非常挑剔。有些机器 10 次中有 9 次都能正常工作,然后由于一些奇怪的时间问题而锁定。而其他的则根本无法工作。好极了!
triple - 尝试生成三重故障。这是通过加载一个空的中断描述符表然后调用 int(3) 来完成的。中断失败(没有 IDT),故障处理程序失败(没有 IDT),并且 CPU 进入一个条件,理论上应该会触发重置。但似乎没有要求这样做,而且它在很多机器上都不起作用。
pci - 实际上不是 pci。传统的 PCI 配置空间访问是通过将 32 位值写入 io 端口 0xcf8 来识别总线、设备、功能和配置寄存器来实现的。然后端口 0xcfc 包含相关寄存器。但是,如果您将适当的一对魔法值写入 0xcf9,机器将重新启动。太壮观了!而且没有任何标准化(当然不是 PCI 规范的一部分),因此不同的芯片组可能有不同的要求。嘘。
efi - EFI 运行时服务提供重启机器的入口点。通常情况下,它甚至可以正常工作!只要 EFI 运行时服务正常工作,这可能有点夸张。
acpi - ACPI 规范的最新版本允许您提供一个地址(通常是内存或系统 IO 空间)和一个要写入的值。其想法是将值写入该地址会重置系统。事实证明,这样做经常会失败。通过 ACPI 表示 PCI 重启方法也不可能,因为 PCI 重启方法需要一对值,而 ACPI 只提供一个值。
答案4
当然,在电源管理出现之前,计算机仍然可以自行重启。(有人记得当程序冻结时,您必须使用 Ctrl+Alt+Delete 来重新启动计算机吗?)
在我的旧 486 上,汇编语言命令JMP FFFF:0000
(即,将 CPU 的指令指针设置为所述地址)会导致整个计算机重新启动。换句话说,FFFF:0000
在 BIOS 中寻址一个位置,该位置包含计算机首次启动时应执行的操作的指令。我怀疑 AndrejaKo 的回答中描述的重置引脚,或电源管理时代之前的重置按钮,也会强制将指令指针指向相同的地址。
A谷歌搜索 JMP FFFF:0000揭示了许多与此相关的有趣的页面。