特权指令,陷阱和系统调用之间的关系

时间:2013-05-18 08:19:59

标签: operating-system x86 virtualization computer-architecture

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

2 个答案:

答案 0 :(得分:19)

没有特别的顺序:

您的困惑主要是由于操作系统社区没有标准化词汇。以下是一些被抛弃的术语有时意味着同样的事情,有时不是:异常错误中断系统调用陷阱。任何个体作者通常都会一致地使用这些术语,但不同的作者会以不同的方式定义它们。

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

  1. 异步中断(例如,由需要服务的I / O设备引起。)
  2. 系统调用指令(x86上的int)。 (更一般地说,在x86手册中,这些被称为陷阱并包含其他一些指令(主要用于调试器)。)
  3. 执行异常操作的指令(非法指令,保护错误,0分频,页面错误......)。 (不同的作者称这些例外错误陷阱 .x86手册称这些错误。)
  4. 每个中断,陷阱或故障都有不同的编号。

    在所有情况下:

    1. 处理器进入特权模式。
    2. 用户模式寄存器保存在某处。
    3. 处理器找到中断向量表的基址,并使用中断/陷阱/故障编号作为表中的偏移量。这给出了指向该中断/陷阱/故障的服务例程的指针。
    4. 处理器跳转到服务例程。现在我们处于保护模式,用户级状态全部保存在我们可以获得的位置,并且我们在操作系统内部使用正确的代码。
    5. 当服务例程完成时,它会调用中断返回指令(x86上的iret。)(这是x86上故障和陷阱之间的细微区别:故障返回到导致故障的指令,陷阱在陷阱后返回指令。)
    6. 请注意混淆名称“中断向量表”。即使它被称为中断表,它也用于故障和陷阱。 (这导致一些作者将所有称为中断。)

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

      这有关系吗?那么,对于正常的操作系统来说,这并不重要。另一方面,如果您正在实施虚拟机监视器(如VMWare或Xen或Hyper-V),则VMM正在受保护模式下运行,并且您希望以用户模式运行客户机操作系统 并有效模拟任何受保护的模式代码。当客户机操作系统使用{<1}}指令时,您希望它生成一般保护错误,但事实并非如此。 (如果从用户模式调用,popfcli指令会产生一般保护错误。这就是你想要的。)

答案 1 :(得分:12)

我不是计算机架构方面的专家。但我有几点意见供你考虑:

  1. CPU有两种指令
    • 正常说明,例如add,sub等。
    • 特权说明,例如,从受保护的内存中启动I / O,load/store等。
  2. 机器(CPU)有两种模式(由受保护寄存器中的状态位设置):
    • 用户模式:处理器在用户程序中执行普通指令
    • 内核模式:处理器执行普通特权指令(OS ==内核)
  3. 操作系统将特权指令隐藏为system calls。如果用户程序调用它们,它将导致异常(抛出软件中断),这就是 向内核处理程序,trap内核模式和切换上下文的向量。
  4. 用户模式中遇到特权指令,处理器trap到内核模式。根据发生的情况,它将是几个陷阱中的一个,例如内存访问冲突,非法指令违规或寄存器访问冲突。陷阱将处理器的执行切换到内核模式,并将控制权切换到操作系统,然后操作系统决定操作过程。该地址由trap vector定义,{{3}}是在操作系统启动时设置的。