电脑Reset背后发生了什么?
电脑重启在有些人看来就是关机再开机。对于用Windows 8以前版本的用户来说,重启和关机再开机感受没有什么不同,会将系统运行过程中的数据清掉。Windows 8/10启用了快速启动,从而两者产生了明显不同。简单来说:关机再开机,会利用休眠功能(hibernate)直接进入到一个预存储的登陆画面,加速启动,但环境并不干净;而重启则不变,从0开始一个个加载驱动,相对更加干净,也更慢。
操作系统当然是能够区分重启和关机再开机的,那么主板和CPU这么多种,它是怎么知道如何重新启动的呢?是通过ACPI,ACPI的Fixed ACPI Description Table(FADT)表定义了如何reset:
简单来说就是BIOS要通过FADT表来告诉操作系统,像哪个寄存器(RESET_REG)写入什么值(RESET_VALUE)会重启。操作系统记住以后,在有重启的需求时照着做就好了。
Reset的种类
我们可以使用查看ACPI的工具,在Windows下看BIOS到底在FADT里报上来什么寄存器。可以使用RW或者HE工具。会看到现在大多数使用Intel芯片组的电脑,都是告诉OS,向0xCF9的IO口写入6。这里用HE工具查看,FACP表就是FADT表。
那这个神奇的0xCF9 IO端口是什么东西呢?它一般是南桥或者southcomplex实现的逻辑,在它之前还有0x92和0x66端口。CF9的使用已经好多代了,可以找到它的寄存器定义如下:
简单来说,就是:
- 写入02,光进行CPU的reset,也叫soft reset,即将CPU的INIT#信号拉低16个PCI clock。CPU会重新启动,重新从reset vector执行程序。这时很多CPU的uncore寄存器和南桥芯片组寄存器都没有被reset。
- 写入06,进行hard reset。这是最常用的reset。它通过assert PLTRST#信号,通知所有芯片,包括外围的网卡等等,一起reset。过后系统的绝大多数寄存器都会被重置为缺省值,CPU当然也会从reset vector开始执行程序。
- 写入0x0E,进行Full reset,这是最彻底的reset。系统会经历一次full power cycle,看起来也就是关机再开机了一次,风扇也会挺一下,再运行。系统会依次经历S3,S4,S5的过程,时间较长。它会在2)的基础上重置一下需要关机才能清除的寄存器,有时候这些动作在设置某些功能时是必不可少的。
你要问还有没有更牛的reset,其实还有一个,那就是global reset。0xCF9的reset只影响inband的所有器件,而global reset还会reset out-of-band的模块,譬如ME和BMC等等。Global Reset需要置起相应标志位
参考:
Reset重启后发生了什么?它和关机后再开机有什么区别?
汇川归海: 估计是你下载了某些插件,在使用常规运行的时候它修改了你的 task.json 使得你运行的并不是你想要的 exe 文件,一般默认生成的是 mian.exe,但是多文件的话 task.json 一般设置是当前工程目录的名字,所以你禁用插件或者改一下插件的设置就行了
萌新届大佬一枚: 明白了
CSDN-Ada助手: 不知道 Java 技能树是否可以帮到你:https://edu.csdn.net/skill/java?utm_source=AI_act_java
trytry731: 只能说没有报错,各种重装了驱动也是无解呢。但是显示有问题,感觉是驱动和win10之间并不兼容。以前没这个问题,可能是win10自动更新到某个版本后就会偶发了。比如这会儿就是错的
Yang_Winston: 识别错的时候,显卡驱动是正常的吗,一般来说是固定一个displayid的