簡體   English   中英

全虛擬化虛擬機如何進行進程切換?

[英]How does process switch take place in full virtualized VM?

我知道,當完全虛擬化的虛擬機中的程序嘗試執行特權指令時,由於它在用戶模式下運行,因此會發生“陷阱和模擬”,因此在主機中運行的 Hypervisor 會控制 CPU 和模擬特權指令,因為特權指令需要在系統模式下執行,但 VM(應用程序和內核)中的所有代碼都在用戶模式下執行。

我想知道在發生時間中斷並且必須執行調度程序例程之后,例如兩個進程之間的 VM 內的內容切換會發生什么。 調度程序不應該在系統模式下執行嗎? 那么,虛擬機內的兩個進程之間每次切換時,虛擬機管理程序都會進行控制嗎?

我知道,當完全虛擬化的虛擬機中的程序嘗試執行特權指令時,由於它在用戶模式下運行,因此會發生“陷阱和模擬”,因此在主機中運行的 Hypervisor 會控制 CPU 和模擬特權指令,因為特權指令需要在系統模式下執行,但 VM(應用程序和內核)中的所有代碼都在用戶模式下執行。

這在一定程度上取決於虛擬機的實現方式(以及哪種架構); 但是“在用戶模式下運行訪客 kernel”幾乎從未發生過。 大多數實現要么解釋和/或 JIT 編譯代碼(因此不直接執行原始來賓代碼)或使用硬件輔助虛擬化(來賓 kernel 代碼以最高權限級別運行,但仍會在需要時捕獲到管理程序)。 部分原因(至少對於 80x86)是一些非特權指令(例如SIDT )會從主機泄漏信息而不會陷入陷阱。

我想知道在發生時間中斷並且必須執行調度程序例程之后,例如兩個進程之間的 VM 內的內容切換會發生什么。 調度程序不應該在系統模式下執行嗎? 那么,虛擬機內的兩個進程之間每次切換時,虛擬機管理程序都會進行控制嗎?

通常它比這低 - 例如,管理程序只關心從一個虛擬地址空間切換到另一個虛擬地址空間,使用 IO 與設備通信等事情。

如果您將調度分成多個部分(決定切換到哪個任務,保存前一個任務的 state,必要時切換虛擬地址空間/如果不是屬於同一進程的線程之間的切換,加載新任務的狀態)您可以說管理程序幾乎不關心所有這些(例如,只關心數百條指令中的一條指令)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM