电脑怎么实现软件关机的?和按下电源键关机有啥区别?
在现代计算机上,物理按下按钮关机和在操作系统中鼠标点选关机的后的步骤,绝大部分都是一样的。尤其是硬件部分,几乎完全一样;在软件部分,也有大半也是完全一致的。其实,关机的步骤相当复杂,为了尽可能不损坏用户数据,也为了保护硬件,就要实现“优雅”地关机,而不能把电源一断了之。为此值得我们来详细探究一下。
软件部分
如果你曾经使用过Windows95,你一定会记得当时的一个铁律,必须正确关机!我们要点击关机菜单,在三个选项中选择关机才好。像这样按下电源键是绝对不行的:
我们按下电源键真的会立刻切断整机电源,如果你足够幸运,下次也许跑个Scandisk就行了,如果你没有这么幸运,你没有保存的文件可能就丢失了!这个设计简直是反人类,和我们其他电器的使用习惯完全不同。幸亏当时PC还是高大上的高科技产品而不是现在四处可见的普通电器,否则微软一定会被骂死。
Window98和随后的WindowsXP引入了ACPI,情况才得到改善。到这时,软件关机和按钮关机的很多步骤都开始统一起来了。
ACPI定义了两种电源键:Fixed hardware power button和Control method power button。Fixed hardware power button一般对应南桥或者SOC中的PWRBTN#引脚,而Control method power button一般可以用GPIO等扩展,它需要在ACPI table中报告_HID(PNP0C0C)设备并提供_GPE Event。为了简单起见,我们以最常见的PWRBTN#来说明整个流程:
1. 用户按下电源键,并抬起。
2. PWRBTN#被触发。
3. PWRBTN_STS被置1。
4. SCI产生。
5. 操作系统的OSPM发现SCI是电源键产生,随后检查用户的电源键设置偏好。用户可以设置睡眠或者关机。
到这里,前面都说处理物理电源键按下的部分。下面步骤开始,操作系统点选关机和按下物理按键就完全一致了:
6. 如果是关机,通知各个应用程序保存退出;通知各个驱动程序电源事件。有序关闭应用和驱动。
7. 调用关机前的各个ACPI定义的Event。
8. 写MADT表中的电源管理寄存器真正关机,进入S0 -> G2/S5流程。
到这里,操作系统在做好了所有软件上的清理现场工作,做好了下电的准备。当写入南桥PCH的电源管理寄存器之后,硬件逻辑开始接手了。
硬件流程
为了硬件上优雅的关机,保护系统各个部分,以及下次能够正常的开机,关机的流程十分复杂,正常下来可以有至少四五十个步骤!这不是危言耸听,因为相关方涉及:PCH中的PMC和ME、CPU、各种VR、主板上的PLD/CPLD、BMC或者EC/SIO,内存和电源PSU等等器件和逻辑。实际上,S0到S5并不是一蹴而就的,而是从S0->S3->Deep Sx一级级台阶一样下去的,甚至和主板的全局Reset的逻辑都有很大公共部分。在这里,软件关机和按下电源键关机走的流程完全一致。
如果你打开一个“decent”的主板原理图,一定有一页叫做Power Sequence Timing Diagram,它是站在主板层面上看关机时序的。芯片手册里面也有一个类似的部分,它是占住CPU和桥片的角度上看关机时序的。无论哪个角度,步骤都相当多,这里大大简化一下:
写下电源管理寄存器后,PCH中的PMC和它的固件开始执行关机流程:PMC通知CPU/VR要关机了,CPU开始整理内部逻辑和降低电压,之后发送ACK信息;PMC开始逐步拉低SLP_S3#、SLP_S4#、SLP_S5#。
PMC和ME、BMC、EC开始沟通逐渐关闭各种Power Rail,包括内存等等的。其中CPLD负责关闭主板上很多Power Rail并告知PMC。
CPLD通过PS_ON#置低,告知电源PSU准备下电。
PSU通过PWR_OK#告诉CPLD收到。
过一段时间,PSU切断12VDC, 5VDC和3VDC的输出。关机完毕。注意关机后5V SB还是保持输出,为下次上电做好准备。
结论
你也行想不到,关个机还这么复杂,实际上,开机的过程更加复杂。不过,大部分人不需要了解这么多,很多相关方都在代替大家负重前行!
参考资料