在我看来: 软复位:从复位向量启动。 硬复位:拉cpu的电平。
4 回答
硬复位当然意味着整个 CPU 芯片及其所有外围设备都被复位。造成这种情况的原因可能有很多:外部拉复位引脚、时钟故障、片上低电压检测、看门狗、非法指令陷阱等。
软复位可能意味着返回到复位向量的“脏”分支,其中复位向量恢复所有 CPU 内核寄存器,包括堆栈。我会说这是非常有问题的做法,我不确定它会有什么好处。主要问题是当您执行此操作时,所有 MCU 外围硬件寄存器都不会重置为默认值。几乎不可能不对所有此类寄存器的复位状态做出任何假设,尤其是因为现在平均 MCU 配备了 1000 多个这样的寄存器。因此,通过这种软和脏重置,您很可能最终会出现这样的行为:
subtle intermittent bugs <= my program <= complete haywire
更牵强的是,软复位可能意味着由软件引起的复位。在这种情况下,它可能会将错误的值写入看门狗寄存器以强制复位,或者无法刷新看门狗。或者它可能是执行非法指令。这些很可能会导致整个芯片完全复位。
我假设这可以从芯片到芯片。硬复位可能被认为是设备(引脚、球等)上的复位线,当沿某个方向拉动时,会将部分或全部芯片置于复位状态。软复位,可以简单到分支到零或分支到复位向量,或者它可能是您写入的寄存器或导致硬复位的寄存器中的位,或者可能是接近硬复位的东西,想象一下芯片内部层,硬复位击中外层,软复位击中某些内层可能不是整个芯片。例如,您可能不想从 pcie 总线上掉下来,所以不要管它。通常,例如 jtag(或它的某些部分)不应该被任何一个重置所触及。当软件拉出一条复位线时它会自杀,谁来释放那个复位?硬件方面的东西,
在 Intel 平台上,软复位(写入0x4
端口0xcf9
)是 CPU 热复位,即 CPU 运行时的复位。热复位(写入0x6
端口0xcf9
)是没有电源循环的主机复位,硬复位(写入0xe
端口0xcf9
)是带有电源循环的主机复位。全局重置是 Intel ME 的重置与主机重置相结合。
冷 CPU 复位是在RESET#
最初向 CPU 供电时断言。CPU 热复位是在V_cc 和 CLK 保持在指定的操作限制时发生INIT#
或发生。RESET#
如果您只是INIT#
这样,它只会刷新 BTB 和 TLB,仅初始化整数寄存器并进入重新启动 MSROM 例程(不再仅0xFFFFFFF0
在 UEFI 系统上)。如果你RESET#
那么它刷新缓存以及初始化 FP 寄存器 ,而不仅仅是整数寄存器。这是寄存器的初始状态,我认为是在微码开始之前。如果您同时断言INIT#
和RESET#
一起然后它也会做一个 BIST。我认为在这种情况下,它又重新执行了 BSP 选择过程。MP初始化协议,因为在BIST完成后将BIPI发送给all-including-self,并且我认为当没有BIST时它也会执行BSP选择,即只是RESET#
在暖/冷时(这谈到在一个之后发送一个BIPI复位时可选 BIST)。在现代英特尔 CPU 上,我认为RESET#
每个插槽一个并重置所有内核,并与 PCH 绑定PLTRST#
,而INIT
PCH 在 PCIe VLW事务中通过 DMI 发送,并逐个内核分配给指定的内核在 QPIPNCB 等 CPU 寄存器中配置。
热复位是PLTRST#
PCH 对许多组件的断言,系统停留在 S0 中。在硬重置时,系统循环SLP_S0#
到SLP_S5#
然后循环SLP_S5#
到SLP_S0#
最终到 S0 C0(PLTRST#
最终被取消断言时),这将导致 DRAM 被重置,这PLTRST#
本身不会这样做。SLP_S0 - S5#
高表示 CPU 在 S0 C0。SLP_S0#
low 表示在 S0 Cx 中,SLP_S0#
lowSLP_S3#
表示在 S3 中,SLP_S0#
low表示在 S4 中,以此类推SLP_S3#
。SLP_S4#
我认为冷重置是当系统从G3 启动并需要通过 PCH_RTCRST#
并EC_RSMRST#
返回到 G3 之前的状态之前,它可能是 DeepSx、S5 或 S4。但是您会看到人们将硬重置称为冷重置,而将冷重置称为冷启动。我可能会使用硬重置和冷启动这两个术语。热启动将是 S3 恢复,而冷启动将从 S4/S5/G3 启动,也许您可以将所有 S4/S5 都设为硬启动,将 G3 设为冷启动。
它可以表示系统设计者想要的任何含义。没有通用的定义。例如,RAM 的内容可以通过软复位来保持,而不是通过硬复位,或者它可能只是外部硬件复位信号和软件复位指令之间的差异。