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

14

我正在尝试理解虚拟机监视器(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指令而不是通过系统调用时,popf指令不应该导致中断,而应该导致保护故障中断。

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

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

不确定这是否适合在这里发布... - Yuval Filmus
谢谢,我已经标记了需要审核。 - datwelk
@YuvalFilmus 我并不认为这个问题在这里是离题的,而且也没有关闭投票。如果你认为这个问题不适合讨论,请在 meta 上提出这个问题。 - Gilles 'SO- stop being evil'
@Gilles,您能否将问题移至Stack Overflow?我认为这里不是正确的地方,因为对于任何拥有计算机科学学位的人来说,这应该是一个非常简单的问题。 - datwelk
2个回答

27

以下排名不分先后:

你的困惑主要是由于操作系统界没有标准化的词汇表。以下是一些经常使用却有时意思相同有时又不同的术语:异常故障中断系统调用陷阱。每个作者通常会始终如一地使用这些术语,但不同的作者定义它们的方式也不同。

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

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

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

在所有情况下:

  1. 处理器进入特权模式。
  2. 用户模式寄存器被保存在某个地方。
  3. 处理器找到中断向量表的基地址,并将中断/陷阱/故障号作为偏移量进入表。 这会给出该中断/陷阱/故障的服务例程的指针。
  4. 处理器跳转到服务例程。现在我们处于保护模式,用户级状态已保存在某个位置,我们在操作系统内部正确的代码中。
  5. 当服务例程完成时,它调用一个中断返回指令(x86 上为 iret)。这是 x86 上故障与陷阱之间微妙的区别:故障返回到引起故障的指令,陷阱返回到陷阱后的指令。
注意“中断向量表”这个容易令人混淆的名称。虽然它被称为“中断”表,但它也用于故障和陷阱。(这导致一些作者将“一切”都称为中断。) popf问题相当微妙。这基本上是x86架构中的一个漏洞。当popf从用户模式执行时,它不会引发陷阱或故障(或异常或中断或其他你想称之为的东西)。它只是作为一个空操作。
这有关系吗? 对于一个普通的操作系统来说,它并不重要。另一方面,如果你正在实现一个虚拟机监视器(如VMWare、Xen或Hyper-V),那么VMM在保护模式下运行,而你希望以用户模式运行并有效地模拟任何受保护的模式代码的客户操作系统。当客户操作系统使用popf指令时,你希望它生成一个常规保护故障,但它没有这样做。(当从用户模式调用时,clisti指令确实生成常规保护故障,这正是你想要的。)

15

我不是计算机架构专家,但我有几个意见供您考虑:

  1. CPU有两种指令类型:
    • 常规指令,例如 add、sub 等
    • 特权指令,例如启动 I/O、从受保护的内存中 load/store
  2. 机器(CPU)有两种模式(由受保护寄存器中的状态位设置):
    • 用户模式: 处理器在用户程序中执行 常规 指令
    • 内核模式: 处理器执行 常规特权 指令(OS==内核)
  3. 操作系统将特权指令隐藏为 系统调用. 如果用户程序调用它们,会导致异常(引发 软件中断),该异常向量到一个内核处理程序,使其陷入 内核 模式并切换上下文。
  4. 用户模式 遇到 特权 指令时,处理器会陷入内核模式。根据发生了什么情况,会出现几种异常,例如内存访问冲突、非法指令冲突或寄存器访问冲突。陷阱将处理器的执行切换到 内核模式 并将控制权转移到操作系统,然后操作系统决定采取何种行动。地址由 陷阱向量 定义,在操作系统启动时设置。

1
非常好的答案,谢谢。不过我会接受另一个答案,因为它更加详细。 - datwelk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接