繁体   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