“陷印”技术在2型虚拟机管理程序中如何工作?

时间:2019-07-26 16:55:51

标签: operating-system hypervisor

我正在阅读操作系统概念书中的“虚拟机”一章。

它说:“ 当来宾中的内核尝试执行特权指令时,这是一个错误(因为系统处于用户模式),并导致了真实计算机中VMM的陷阱。VMM获得了控制并执行(或模拟)来宾内核在来宾方面尝试的操作,然后将控制权返回给虚拟机。

如果它是类型1虚拟机管理程序,我认为当来宾OS执行特权指令时,它将捕获到该操作系统,并且该操作系统可以在内核模式下正确模拟它,因为类型1虚拟机管理程序是具有VMM功能的操作系统或专为虚拟化设计的操作系统。

但是,如果是2类虚拟机管理程序,那只是一个普通的用户进程,对吗?用户进程如何模拟特权指令?通过系统调用?但是我认为有些指令不能通过系统调用来模拟?

有人可以帮我解释一下吗?非常感谢。 T_T

2 个答案:

答案 0 :(得分:0)

通常,如果您有一个用户模式的“超级管理程序”,它将模拟硬件的所有特权状态,而不是在实际的硬件上实际运行它。因此,它可以在模拟硬件上模拟特权指令的效果,而无需其自身的任何特权指令。

答案 1 :(得分:0)

它随体系结构而变化,但是一条常见的特权指令可能是从设备寄存器(可能是串行端口)中读取。来宾操作系统可能具有执行以下操作的代码:

   load   UART_STATUS, r0
   and    $1, r0
   jz     $-8   // back to load status
   load   UART_DATA, r0
   ret 

因此,在此,两个加载指令将具有特权; vm监视器可能将第一个解密为:

if (ioctl(serfd, FIONREAD, &count) != -1) {
    state->r0 = (count != 0);
} else {
    raise_error(state, ENXIO); /* or somesuch... */
}

和第二个类似:

unsigned char ch = dont_leak_uninit_value;
if (read(serfd, &ch, 1) >= 0) {
    state->r0 = ch;
} else {
    raise_error(state, ENXIO); /* ... */
}

因此,将任何tty / file / socket / ...连接到serfd都会获取和接收模拟的串行端口。

对于诸如中断状态之类的情况,情况有些棘手,因为大多数cpus有点废话。抽象来说,一台机器可以提供“虚拟中断状态”,该状态由来宾维护,但实际上并不影响该机器的中断。因此,它可以使用特权指令随意设置和清除此状态,因为它实际上不影响任何操作。 VMM仅需确保为访客适当保存和​​恢复此“虚拟状态”。大多数此类特权指令都可以类似的方式处理或仿真。