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

dat*_*elk 13 virtualization x86 operating-system 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处于用户模式时执行特权指令时会发生什么?
  • 用户程序执行系统调用时会发生什么?

Wan*_*gic 20

没有特别的顺序:

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

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

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

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

在所有情况下:

  1. 处理器进入特权模式.
  2. 用户模式寄存器保存在某处.
  3. 处理器找到中断向量表的基地址,并使用中断/陷阱/故障号作为表中的偏移量.这给出了指向该中断/陷阱/故障的服务例程的指针.
  4. 处理器跳转到服务例程.现在我们处于保护模式,用户级状态全部保存在我们可以获得的位置,并且我们在操作系统内部使用正确的代码.
  5. (当服务程序结束它会调用中断返回指令iret.在x86)(这是一个错误,并在x86陷阱之间的微妙区别:故障恢复导致该故障的指令,陷阱返回指令的陷阱.)

注意令人困惑的名称"中断向量表".即使它被称为中断表,它也用于故障和陷阱.(这导致一些作者将所有内容称为中断.)

这个popf问题相当微妙.这本质上是x86架构中的一个错误.当popf从用户模式中执行它并不会导致陷阱或故障(或异常或中断或任何你想调用它.)它只是作为一个空操作.

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


Min*_*Liu 13

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

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