【问题标题】:The relation between privileged instructions, traps and system calls特权指令、陷阱和系统调用之间的关系
【发布时间】:2013-05-15 00:41:50
【问题描述】:

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

【问题讨论】:

  • 不确定这属于这里...
  • 谢谢,我已将其标记为审核
  • @YuvalFilmus 我不相信这是题外话,也没有接近投票。如果你认为这个问题跑题了,请raise the issue on meta
  • @Gilles 您介意将问题移至 Stack Overflow 吗?我认为这不是正确的地方,因为对于任何拥有 CS 学位的人来说,这应该是一个非常简单的问题。

标签: operating-system x86 virtualization computer-architecture


【解决方案1】:

不分先后:

您的困惑主要是因为操作系统社区没有标准化的词汇。以下是一些经常使用的术语,有时意思相同,有时不同:exceptionfaultinterrupt系统调用 陷阱。任何个人作者通常都会一致地使用这些术语,但不同的作者对它们的定义不同。

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

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

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

在所有情况下:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 很好的答案,谢谢。不过接受另一个,因为它更广泛。
    猜你喜欢
    • 1970-01-01
    • 2018-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-16
    • 1970-01-01
    • 2018-04-25
    • 1970-01-01
    相关资源
    最近更新 更多