国产成人精品无码青草_亚洲国产美女精品久久久久∴_欧美人与鲁交大毛片免费_国产果冻豆传媒麻婆精东

15158846557 在線咨詢 在線咨詢
15158846557 在線咨詢
所在位置: 首頁 > 營銷資訊 > 網(wǎng)站運營 > QEMU如何實現(xiàn)虛擬機關(guān)機和重啟

QEMU如何實現(xiàn)虛擬機關(guān)機和重啟

時間:2023-06-30 11:00:01 | 來源:網(wǎng)站運營

時間:2023-06-30 11:00:01 來源:網(wǎng)站運營

QEMU如何實現(xiàn)虛擬機關(guān)機和重啟:

1. 概述

突然發(fā)現(xiàn),QEMU的hmp命令中,只有關(guān)機(system_powerdown)和整個系統(tǒng)復(fù)位(system_reset,直接虛擬機硬件復(fù)位)的命令,并沒有虛擬機重啟的命令。那QEMU是如何區(qū)分和實現(xiàn)虛擬機系統(tǒng)的關(guān)機和重啟操作的呢?如果再將操作的來源(虛擬機內(nèi)、虛擬機外)考慮在內(nèi),則可以將這個問題拆分成四個問題問題:

  1. 虛擬機內(nèi)關(guān)機操作的實現(xiàn)
  2. 虛擬機外關(guān)機操作的實現(xiàn)
  3. 虛擬機內(nèi)重啟操作的實現(xiàn)
  4. 虛擬機外重啟操作的實現(xiàn)
對于計算機電源方面的操作,其實可以有多種實現(xiàn)方式,目前主流的操作系統(tǒng),如Windows、Linux,基本上都是支持基于ACPI機制實現(xiàn)的,以下的介紹也都是基于ACPI機制。并且,可以通過QEMU的qmp事件來獲取QEMU發(fā)生的一些事件,查看到虛擬機的行為。

2. ACPI電源管理機制

ACPI標(biāo)準(zhǔn)中,會對系統(tǒng)的各種電源狀態(tài)定義成Sx狀態(tài),如正常工作為S0,Win10的休眠對應(yīng)S4,關(guān)機對應(yīng)S5等。并且在提交給OS的ACPI表中,會定義System State Package,告知OS需要往PM1a/b_CNT.SLP_TYPE控制寄存器寫入什么樣的數(shù)值讓系統(tǒng)進入對應(yīng)的Sx狀態(tài)。

如,在虛擬機的ACPI表的DSDT子表中,找到如下S5 Package State的定義,即表示需要為PM1a/b_CNT.SLP_TYPE中寫入0,讓系統(tǒng)進入S5(Soft Off)狀態(tài),也就是咱們正常說的關(guān)機狀態(tài)。

3. 虛擬機內(nèi)關(guān)機操作的實現(xiàn)

當(dāng)在Win10虛擬機內(nèi)點擊Windows菜單中帶的關(guān)機按鈕后,當(dāng)Windows關(guān)閉完各種程序后,在虛擬機關(guān)閉的瞬間,QEMU會收到SHUTDOWN事件,并且geust為True表示該關(guān)機操作是由Guest OS發(fā)起的。

查看QEMU源碼,可以發(fā)現(xiàn),

當(dāng)虛擬機向PM1 Control Register的Sleep Type和Enable寄存器寫的時候,如果Type為soft power off即S5,就會觸發(fā)關(guān)機操作,即發(fā)出shutdown請求。

QEMU主線程在收到shutdown reqeust的請求后,會發(fā)送SHUTDOWN事件,然后qemu進程退出,完成虛擬機的關(guān)機操作。

4. 虛擬機外關(guān)機操作的實現(xiàn)

QEMU虛擬機外的關(guān)機操作是通過hmp的system_powerdown命令實現(xiàn)的,libvirt的virsh shutdown命令也是通過發(fā)送system_powerdown命令實現(xiàn)的。

和虛擬機內(nèi)觸發(fā)關(guān)機操作類似,只是關(guān)機操作的觸發(fā)源不一樣,system_powerdown模擬的是電源鍵按下的操作。

hmp_system_powerdown -> qmp_system_powerdown -> qemu_system_powerdown_request

main_loop_should_exit在檢測到powerdown請求的時候,調(diào)用qemu_system_powerdown()

qapi_event_send_poerdown發(fā)出POWERDOWN事件。

ICH9初始化(ich9_pm_init)的時候,會注冊一個powerdown notifier,即pm_powerdown_req

該notifier會模擬電源鍵按下產(chǎn)生ACPI SCI中斷,OS在收到這個中斷的時候,就會做出相應(yīng)的處理。默認(rèn)情況下,Windows的操作就是關(guān)機。

但是如果將WIndows系統(tǒng)中電源按鈕的的動作設(shè)置為不采取任何動作,即檢測到電源鍵按下后,不做任何操作,則hmp的system_powerdown命令或者libvirt的virsh shutdown命令將被Windows忽略,不做任何操作。

5. 虛擬機內(nèi)重啟操作的實現(xiàn)

對于支持ACPI電源管理的虛擬機(Guest OS)而言,虛擬機內(nèi)觸發(fā)的系統(tǒng)重啟也是優(yōu)先通過ACPI機制實現(xiàn)的。查看Linux內(nèi)核源碼reboot命令的實現(xiàn),可以看到最后執(zhí)行對硬件執(zhí)行reset的時候,會優(yōu)先選擇FADT提供的reset register。

以Q35主板為例,Q35主板的南橋芯片ICH9帶有reset控制邏輯單元,即lpc-reset-control,用于reset整個系統(tǒng)或者是CPU,當(dāng)虛擬機往這邊寫的時候,會觸發(fā)相應(yīng)的reset操作。

對應(yīng)的Reset寄存器定義如下所示:

當(dāng)往RST_CPU比特位寫1的時候,就會觸發(fā)qemu_system_reset_request()。

在ACPI標(biāo)準(zhǔn)中,也有對Reset Register進行定義:

前面說的ICH9中的lpc-reset-control就是Reset Register的一種具體實現(xiàn)。

ACPI大表中FADT(簽名為FACP)表的Offset 116起的12個字節(jié)的RESET_REG,RESET_REG包含reset regsiter的地址。并且Offset 112的Flags有比特位用于表示RESET_REG是否有實現(xiàn)。

其中RESET_REG字段包含的GAS(Generic Address Structure)的定義如下所示:

以Q35主板為例,在虛擬機內(nèi),通過RW Everything可以看到ACPI表中,F(xiàn)ACP表中的Flags標(biāo)記中,RESET_REG_SUP為1,標(biāo)志系統(tǒng)支持RESET_REG寄存器。

并且reset register的地址為I/O port 0xCF9,并且reset value為0x0F,即往里面些0x0F后,系統(tǒng)會reset。

Guest OS根據(jù)這些信息,在執(zhí)行系統(tǒng)重啟的最后階段(即OS已經(jīng)保存好狀態(tài),為最后主要硬件的reset做好準(zhǔn)備),就會將reset value的值寫到reset register中,觸發(fā)主板硬件執(zhí)行reset操作。

根據(jù)前面的代碼,QEMU在實現(xiàn)ICH9中的Reset寄存器的時候,當(dāng)往Reset寄存器寫的時候,就會觸發(fā)reset請求(qemu_system_reset_request()),執(zhí)行qemu_system_reset,并發(fā)出RESET事件。

在虛擬機的hmp通道中就可以看到RESET事件,并且guest為Ture,說明是Guest OS主動觸發(fā)的reset操作。

6. 虛擬機外重啟操作的實現(xiàn)

對于QEMU的qmp/hmp通道而言,是沒有虛擬機重啟的命令的,只有硬件重啟(system_reset)命令,但是在libvirt端卻有虛擬機重啟的virsh reboot命令,那virsh reboot是如何實現(xiàn)的呢?

virsh reboot重啟虛擬機是模擬按電源鍵觸發(fā)Windows關(guān)機 ,即POWERDOWN事件,然后Windows關(guān)機,觸發(fā)SHUTDOWN事件(guest為true)。Windows關(guān)機后,qemu進程不退出,然后由libvirt觸發(fā)RESET事件(guest為false),觸發(fā)虛擬機硬件reset,讓虛擬機重新啟動。

所以virsh reboot實際上是通過虛擬機關(guān)機,qemu進程不退出、虛擬機系統(tǒng)硬件reset的操作來實現(xiàn)的,對Guest來說其實就是關(guān)機再開機,并不是真正的重啟。

如果Guest OS針對用戶發(fā)起的關(guān)機和重啟操作執(zhí)行的關(guān)機過程有所區(qū)別的話,virsh reboot操作其實就無法實現(xiàn)Guest OS的重啟操作。以Win10 Guest OS為例,若Win10開啟了快速啟動,在Windows的關(guān)機過程中,Windows的內(nèi)核其實是進行了休眠而不是關(guān)閉,所以系統(tǒng)重啟后,會發(fā)現(xiàn),Windows的內(nèi)核運行時間并沒有清零,而是累加了上次關(guān)機前的運行時間。

7. 總結(jié)

綜上所述,QEMU的虛擬機內(nèi)關(guān)機是通過模擬ACPI電源控制寄存器(PM1a/b_CNT)實現(xiàn)的,虛擬機外的關(guān)機則是通過模擬電源按鍵實現(xiàn)的。虛擬機內(nèi)的重啟操作,是通過模擬Reset控制寄存器實現(xiàn)的。但是,虛擬機外重啟操作并沒有直接的模擬,主要是因為Guest OS對外并沒有重啟操作的接口,并且重啟操作過程中,Guest OS是需要保存自己的軟件狀態(tài)的,什么時候執(zhí)行底層的硬件reset操作,QEMU本身并不知道(Guest OS)并不會提前告知硬件,或者對外發(fā)出事件。所以虛擬機外并沒有真正的重啟操作命令,而是通過虛擬機關(guān)機、再啟動實現(xiàn)的,這時候就需要具體的管理程序,如libvirt,對虛擬機的關(guān)機、啟動的過程進行跟蹤和監(jiān)控,并且這種實現(xiàn)方式在少數(shù)場景(如Win10開啟了快速啟動)將不適用。

關(guān)鍵詞:機關(guān),虛擬,實現(xiàn)

74
73
25
news

版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。

為了最佳展示效果,本站不支持IE9及以下版本的瀏覽器,建議您使用谷歌Chrome瀏覽器。 點擊下載Chrome瀏覽器
關(guān)閉