1. 概述
突然发现,QEMU的hmp命令中,只有关机(system_powerdown)和整个系统复位(system_reset,直接虚拟机硬件复位)的命令,并没有虚拟机重启的命令。那QEMU是如何区分和实现虚拟机系统的关机和重启操作的呢?如果再将操作的来源(虚拟机内、虚拟机外)考虑在内,则可以将这个问题拆分成四个问题问题:
- 虚拟机内关机操作的实现
- 虚拟机外关机操作的实现
- 虚拟机内重启操作的实现
- 虚拟机外重启操作的实现
对于计算机电源方面的操作,其实可以有多种实现方式,目前主流的操作系统,如Windows、Linux,基本上都是支持基于ACPI机制实现的,以下的介绍也都是基于ACPI机制。并且,可以通过QEMU的qmp事件来获取QEMU发生的一些事件,查看到虚拟机的行为。
2. ACPI电源管理机制
ACPI标准中,会对系统的各种电源状态定义成Sx状态,如正常工作为S0,Win10的休眠对应S4,关机对应S5等。并且在提交给OS的ACPI表中,会定义System State Package,告知OS需要往PM1a/b_CNT.SLP_TYPE控制寄存器写入什么样的数值让系统进入对应的Sx状态。
如,在虚拟机的ACPI表的DSDT子表中,找到如下S5 Package State的定义,即表示需要为PM1a/b_CNT.SLP_TYPE中写入0,让系统进入S5(Soft Off)状态,也就是咱们正常说的关机状态。
3. 虚拟机内关机操作的实现
当在Win10虚拟机内点击Windows菜单中带的关机按钮后,当Windows关闭完各种程序后,在虚拟机关闭的瞬间,QEMU会收到SHUTDOWN事件,并且geust为True表示该关机操作是由Guest OS发起的。
查看QEMU源码,可以发现,