Operating system 特权指令、陷阱和系统调用之间的关系

Operating system 特权指令、陷阱和系统调用之间的关系,operating-system,x86,virtualization,computer-architecture,Operating System,X86,Virtualization,Computer Architecture,我试图了解虚拟机监视器(VMM)如何虚拟化CPU 我现在的理解是,当CPU处于用户模式时,特权指令即将执行时,CPU会发出保护故障中断。在像C这样的高级语言中,特权指令被包装在系统调用中。例如,当应用程序需要当前日期和时间(与I/O设备交互的指令具有特权)时,它会调用某个库函数。此库函数的汇编版本包含一条名为“int”的指令,该指令会导致CPU中出现陷阱。CPU从用户模式切换到特权模式,并跳转到操作系统提供的陷阱处理程序。每个系统调用都有自己的陷阱处理程序。在本例中,陷阱处理程序从硬件时钟读取日

我试图了解虚拟机监视器(VMM)如何虚拟化CPU

我现在的理解是,当CPU处于用户模式时,特权指令即将执行时,CPU会发出保护故障中断。在像C这样的高级语言中,特权指令被包装在系统调用中。例如,当应用程序需要当前日期和时间(与I/O设备交互的指令具有特权)时,它会调用某个库函数。此库函数的汇编版本包含一条名为“int”的指令,该指令会导致CPU中出现陷阱。CPU从用户模式切换到特权模式,并跳转到操作系统提供的陷阱处理程序。每个系统调用都有自己的陷阱处理程序。在本例中,陷阱处理程序从硬件时钟读取日期和时间并返回,然后CPU将自己从特权模式切换到用户模式。(来源:)

然而,我不太确定这种理解是否正确。本文提到(特权)x86 popf指令不会导致陷阱的概念,从而使VMM的事情变得复杂。据我所知,当用户程序显式调用而不是通过系统调用时,popf指令不应导致陷阱,而应导致保护故障中断

因此,我的两个具体问题是:

  • 当CPU处于用户模式时,用户程序执行特权指令时会发生什么情况
  • 当用户程序执行系统调用时会发生什么

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

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

    • 无特定顺序:

      您的困惑主要是因为操作系统社区没有标准化的词汇表。这里有一些术语,有时指的是同一件事,有时指的不是:异常、故障、中断、系统调用和陷阱。每个作者通常会一致使用这些术语,但不同的作者对它们的定义不同

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

    • 异步中断(例如,由需要服务的i/o设备引起)
    • 系统调用指令(x86上的
      int
      )。(更一般地说,在x86手册中,这些被称为陷阱,并包括一些其他指令(主要针对调试器)
    • 执行异常操作的指令(非法指令、保护故障、除以0、页面故障等)。(不同的作者称这些异常、故障或陷阱。x86手册称这些故障。)
    • 每个中断、陷阱或故障都有不同的编号

      在所有情况下:

    • 处理器进入特权模式
    • 用户模式寄存器保存在某个地方
    • 处理器找到中断向量表的基址,并使用中断/陷阱/故障号作为表中的偏移量。这将为该中断/陷阱/故障提供一个指向服务例程的指针
    • 处理器跳转到服务例程。现在我们处于保护模式,用户级别的状态都保存在我们可以获取的地方,并且我们在操作系统中使用了正确的代码
    • 当服务例程完成时,它调用中断返回指令(
      iret
      on x86)。(这是x86上故障和陷阱之间的细微区别:故障返回到导致故障的指令,陷阱返回到陷阱后的指令。)
    • 请注意令人困惑的名称“中断向量表”。尽管它被称为中断表,但它也用于故障和陷阱。(这导致一些作者将一切都称为中断。)

      popf
      问题相当微妙。这本质上是x86体系结构中的一个缺陷。当
      popf
      从用户模式执行时,它不会导致陷阱或故障(或异常、中断或任何您想调用它的东西)。它只是充当noop

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