我正在尝试理解虚拟机监视器(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指令而不是通过系统调用时,popf指令不应该导致中断,而应该导致保护故障中断。
因此,我的两个具体问题是:
- 当用户程序在CPU处于用户模式下执行特权指令时会发生什么?
- 当用户程序执行系统调用时会发生什么?