13

我试图了解虚拟机监视器 (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 处于用户模式时,当用户程序执行特权指令时会发生什么?
  • 当用户程序执行系统调用时会发生什么?
4

2 回答 2

24

没有特别的顺序:

您的困惑主要是由于操作系统社区没有标准化的词汇造成的。这里有一些经常使用的术语,有时意思相同,有时不同:异常故障中断系统调用陷阱。任何个人作者通常都会一致地使用这些术语,但不同的作者对它们的定义不同。

有 3 种不同类型的事件会导致进入特权模式。

  1. 异步中断(例如,由需要服务的 i/o 设备引起。)
  2. 系统调用指令(int在 x86 上)。(更一般地,在 x86 手册中,这些被称为陷阱并包括一些其他指令(主要用于调试器。))
  3. 执行异常操作的指令(非法指令、保护错误、除以 0、页面错误……)。(不同的作者称这些异常故障陷阱。x86 手册称这些故障。)

每个中断、陷阱或故障都有一个与之关联的不同编号。

在所有情况下:

  1. 处理器进入特权模式。
  2. 用户模式寄存器保存在某处。
  3. 处理器找到中断向量表的基地址,并使用中断/陷阱/故障编号作为表中的偏移量。这为该中断/陷阱/故障提供了一个指向服务程序的指针。
  4. 处理器跳转到服务程序。现在我们处于保护模式,用户级别的状态都保存在我们可以得到的地方,并且我们在操作系统中的正确代码中。
  5. 当服务程序完成时,它会调用中断返回指令(iret在 x86 上)。(这是 x86 上故障和陷阱之间的细微区别:故障返回到导致故障的指令,陷阱陷阱。)

请注意令人困惑的名称“中断向量表”。尽管它被称为中断表,但它也用于故障和陷阱。(这导致一些作者将一切都称为中断。)

这个popf问题比较微妙。这本质上是 x86 架构中的一个错误。当popf从用户模式执行时,它不会导致陷阱或错误(或异常或中断或任何你想调用它的东西)。它只是充当一个 noop。

这有关系吗?好吧,对于普通的操作系统来说,这并不重要。另一方面,如果您正在实施虚拟机监视器(如 VMWare 或 Xen 或 Hyper-V),则 VMM 正在保护模式下运行,并且您希望在用户模式下运行来宾操作系统并有效地模拟任何保护模式代码。当客户操作系统使用popf指令时,您希望它生成一般保护故障,但它没有。(如果从用户模式调用, cliandsti指令会生成一般保护错误,这正是您想要的。)

于 2013-06-13T19:01:04.310 回答
15

我不是计算机体系结构方面的专家。但我有几个意见供您参考:

  1. CPU有两种指令
    • 普通指令,例如 add、sub 等。
    • 特权指令,例如,启动 I/O,load/store来自受保护的内存等。
  2. 机器(CPU)有两种模式(由受保护寄存器中的状态位设置):
    • 用户模式:处理器执行用户程序中的正常指令
    • 内核模式:处理器执行普通指令和特权指令(OS == 内核)
  3. 操作系统将特权指令隐藏为system calls. 如果用户程序调用它们,它将导致异常(引发软件中断),该异常会引导至内核处理程序、trap内核模式并切换上下文。
  4. 在用户模式下遇到特权指令时,处理器进入内核模式。根据发生的情况,它可能是几个陷阱之一,例如内存访问冲突、非法指令冲突或寄存器访问冲突。陷阱将处理器的执行切换到内核模式,并将控制权切换到操作系统,然后由操作系统决定行动方案。该地址由陷阱向量定义,它是在操作系统启动时设置的。trap
于 2013-06-03T16:39:26.803 回答