1、监听设置回调函数
cpp
static void virtio_rng_device_realize(DeviceState *dev, Error **errp)
{
...
vrng->vmstate = qemu_add_vm_change_state_handler(virtio_rng_vm_state_change, vrng);
}
2、处理函数
cpp
static void virtio_rng_vm_state_change(void *opaque, bool running,
RunState state)
{
VirtIORNG *vrng = opaque;
trace_virtio_rng_vm_state_change(vrng, running, state);
/* We may have an element ready but couldn't process it due to a quota
* limit or because CPU was stopped. Make sure to try again when the
* CPU restart.
*/
if (running && is_guest_ready(vrng)) {
virtio_rng_process(vrng);
}
}
3、去掉监听
cpp
static void virtio_rng_device_unrealize(DeviceState *dev)
{
VirtIODevice *vdev = VIRTIO_DEVICE(dev);
VirtIORNG *vrng = VIRTIO_RNG(dev);
qemu_del_vm_change_state_handler(vrng->vmstate);
timer_free(vrng->rate_limit_timer);
virtio_del_queue(vdev, 0);
virtio_cleanup(vdev);
}
4、虚拟机状态表
|----------------|-----------------------------|----------|
| 状态 | 含义 | running? |
| running | guest 正在运行 | 是 |
| suspended | guest 挂起(ACPI S3) | 是(算"活的") |
| paused | 通过 stop 命令暂停 | 否 |
| prelaunch | 用 -S 启动,guest 还没开始跑 | 否 |
| inmigrate | 暂停等待 incoming migration | 否 |
| postmigrate | 迁出成功后暂停 | 否 |
| finish-migrate | 暂停以完成迁移过程 | 否 |
| restore-vm | 暂停以恢复 VM 状态 | 否 |
| save-vm | 暂停以保存 VM 状态 | 否 |
| colo | COLO 主备容错中 | 否 |
| io-error | 最后一次 I/O 失败,设备配置成遇错暂停 | 否 |
| watchdog | watchdog 动作配置成暂停,且已触发 | 否 |
| guest-panicked | guest OS panic | 否 |
| internal-error | 发生了阻止 guest 继续执行的内部错误 | 否 |
| shutdown | guest 已关机(且用了 -no-shutdown) | 否 |
| debug | QEMU 在调试器下运行 | 否 |