我试图了解虚拟机监视器(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指令不应该导致陷阱,而应该导致保护错误中断。
所以我的两个具体问题是:
答案 0 :(得分:19)
没有特别的顺序:
您的困惑主要是由于操作系统社区没有标准化词汇。以下是一些被抛弃的术语有时意味着同样的事情,有时不是:异常,错误,中断,系统调用和陷阱。任何个体作者通常都会一致地使用这些术语,但不同的作者会以不同的方式定义它们。
有3种不同类型的事件会导致进入特权模式。
int
)。 (更一般地说,在x86手册中,这些被称为陷阱并包含其他一些指令(主要用于调试器)。)每个中断,陷阱或故障都有不同的编号。
在所有情况下:
iret
。)(这是x86上故障和陷阱之间的细微区别:故障返回到导致故障的指令,陷阱在陷阱后返回指令。)请注意混淆名称“中断向量表”。即使它被称为中断表,它也用于故障和陷阱。 (这导致一些作者将所有称为中断。)
popf
问题相当微妙。这本质上是x86架构中的一个错误。当popf
从用户模式执行时,不会导致陷阱或错误(或异常或中断或您想要调用它的任何内容。)它只是充当noop。
这有关系吗?那么,对于正常的操作系统来说,这并不重要。另一方面,如果您正在实施虚拟机监视器(如VMWare或Xen或Hyper-V),则VMM正在受保护模式下运行,并且您希望以用户模式运行客户机操作系统 并有效模拟任何受保护的模式代码。当客户机操作系统使用{<1}}指令时,您希望它生成一般保护错误,但事实并非如此。 (如果从用户模式调用,popf
和cli
指令会产生一般保护错误。这就是你想要的。)
答案 1 :(得分:12)
我不是计算机架构方面的专家。但我有几点意见供你考虑:
load/store
等。system calls
。如果用户程序调用它们,它将导致异常(抛出软件中断),这就是
向内核处理程序,trap
到内核模式和切换上下文的向量。trap
到内核模式。根据发生的情况,它将是几个陷阱中的一个,例如内存访问冲突,非法指令违规或寄存器访问冲突。陷阱将处理器的执行切换到内核模式,并将控制权切换到操作系统,然后操作系统决定操作过程。该地址由trap vector定义,{{3}}是在操作系统启动时设置的。