当前位置: 首页 > 知识库问答 >
问题:

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

仇正平
2023-03-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指令不应导致陷阱,而应导致保护故障中断。

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

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

共有2个答案

宋望
2023-03-14

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

  • CPU有两种指令
    • 常规说明,如添加、子项等。
    • 特权指令,如启动I/O、从受保护内存加载/存储
    • 用户模式:处理器执行用户程序中的正常指令

夹谷野
2023-03-14

无特定顺序:

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

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

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

每个中断、陷阱或故障都有不同的编号。

在所有情况下:

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

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

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

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

 类似资料:
  • 前言:异常控制流 每个进程对应的程序文件由一条一条的指令组成。进程在执行的时候,会将程序文件加载到进程的内存空间中,这些指令在内存空间中是相邻的。进程会通过调整程序计数器 PC 的值,一条一条地执行指令。我们将进程执行的指令序列叫做处理器的「控制流」。 正常情况下,进程可能会顺序执行相邻的指令(“平滑的”序列),也可能通过跳转、调用和返回等程序指令转移到另一个位置开始执行(平滑流的突变)。无论是前

  • while (<STDIN>) 一定要小心这点。如果你不知怎么回事地得到了假值(如:空行),你的文件可能 停止处理了。假如你在处理文件读取(除非修改了 $/),这种事一般不会发生, 但却可能发生。 你更喜欢这样运行: while (readdir(DIR)) { 假设你有文件名为 0 的话,那么程序将停止,且不会继续处理文件。 更合适的 while 循环看起来像这样: while ( defin

  • 只是想澄清一下制度之间的关系。cpu。计数度量和系统。cpu。SpringBoot 2.3.1致动器指标endpoint的使用指标。 例如,在我的案例中: /actuator/metrics/system.cpu.count的值为:2 /执行器/指标/系统的价值。cpu。用法为:0.024765603908878 这是否意味着我的cpu利用率百分比为:0.024765603908878/2*100

  • 这里归纳了Keras使用过程中的一些常见陷阱和解决方法,如果你的模型怎么调都搞不对,或许你有必要看看是不是掉进了哪个猎人的陷阱,成为了一只嗷嗷待宰(?)的猎物 Keras陷阱不多,我们保持更新,希望能做一个陷阱大全 内有恶犬,小心哟 TF卷积核与TH卷积核 Keras提供了两套后端,Theano和Tensorflow,这是一件幸福的事,就像手中拿着馒头,想蘸红糖蘸红糖,想蘸白糖蘸白糖 如果你从无到

  • 这里归纳了Keras使用过程中的一些常见陷阱和解决方法,如果你的模型怎么调都搞不对,或许你有必要看看是不是掉进了哪个猎人的陷阱,成为了一只嗷嗷待宰(?)的猎物 Keras陷阱不多,我们保持更新,希望能做一个陷阱大全 内有恶犬,小心哟 TF卷积核与TH卷积核 Keras提供了两套后端,Theano和Tensorflow,这是一件幸福的事,就像手中拿着馒头,想蘸红糖蘸红糖,想蘸白糖蘸白糖 如果你从无到

  • 这一章将会介绍使用python自动执行系统命令,我们将使用python展示两个执行命令的方式(os,subprocess). 当你开始创建一个脚本的时候,你会发现os.system和subprocess.Popen都是执行系统命令,它们不是一样的吗?其实它们两个根本不一样,subprocess允许你执行命令直接通过stdout赋值给一个变量,这样你就可以在结果输出之前做一些操作,譬如:输出内容的格