我试图了解虚拟机监视器 (VMM) 如何虚拟化 CPU。
我现在的理解是,当 CPU 处于用户模式时即将执行特权指令时,CPU 会发出保护故障中断。在像 C 这样的高级语言中,特权指令被包装在系统调用中。例如,当应用程序需要当前日期和时间(与 I/O 设备交互的指令具有特权)时,它会调用某个库函数。该库函数的汇编版本包含一条名为“int”的指令,该指令会导致 CPU 陷入陷阱。CPU 从用户模式切换到特权模式并跳转到操作系统提供的陷阱处理程序。每个系统调用都有自己的陷阱处理程序。在此示例中,陷阱处理程序从硬件时钟读取日期和时间并返回,然后 CPU 将自身从特权模式切换到用户模式。(资源:http://elvis.rowan.edu/~hartley/Courses/OperatingSystems/Handouts/030Syscalls.html )
但是,我不太确定这种理解是否正确。本文提到了(特权)x86 popf 指令不会导致陷阱的概念,从而使 VMM 的事情变得复杂:http ://www.csd.uwo.ca/courses/CS843a/papers/intro-vm.pdf . 在我的理解中,当用户程序显式调用而不是通过系统调用时,popf 指令不应该导致陷阱而是保护错误中断。
所以我的两个具体问题是:
- 当 CPU 处于用户模式时,当用户程序执行特权指令时会发生什么?
- 当用户程序执行系统调用时会发生什么?