Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在x86 Intel VT-X非根模式下,是否可以在每个指令边界处传递中断?_X86_Intel_Interrupt_Cpu Architecture_Micro Architecture - Fatal编程技术网

在x86 Intel VT-X非根模式下,是否可以在每个指令边界处传递中断?

在x86 Intel VT-X非根模式下,是否可以在每个指令边界处传递中断?,x86,intel,interrupt,cpu-architecture,micro-architecture,X86,Intel,Interrupt,Cpu Architecture,Micro Architecture,除了某些正常的指定条件,即中断不会传递到虚拟处理器(cli、if=0等),来宾中的所有指令实际上都是可中断的吗 也就是说,当一个传入的硬件中断被提供给LAPIC,然后再提供给处理器时,可能会发生一些内部魔法,将其转换为一个虚拟中断,提供给来宾(使用虚拟APIC,不退出)。当这种情况发生时,当前执行的指令是否会像典型的中断传递那样立即序列化OOO流并跳转到向量,或者VT-x的虚拟中断传递是否会导致其他类型的解析发生 上下文是,使用模拟器强调测试竞争条件和同步原语通常非常有价值。人们希望您的模拟器能

除了某些正常的指定条件,即中断不会传递到虚拟处理器(cli、if=0等),来宾中的所有指令实际上都是可中断的吗

也就是说,当一个传入的硬件中断被提供给LAPIC,然后再提供给处理器时,可能会发生一些内部魔法,将其转换为一个虚拟中断,提供给来宾(使用虚拟APIC,不退出)。当这种情况发生时,当前执行的指令是否会像典型的中断传递那样立即序列化OOO流并跳转到向量,或者VT-x的虚拟中断传递是否会导致其他类型的解析发生

上下文是,使用模拟器强调测试竞争条件和同步原语通常非常有价值。人们希望您的模拟器能够在任何指令下接收中断,从而触发“有趣的行为”

这就引出了一个问题,VT-x虚拟化是否提供了与纯指令仿真器相同的指令级中断粒度,从而触发“有趣的行为”


Intel SDM确实注意到虚拟中断是在指令边界上传递的,但仍然存在一些问题,即芯片上正常有效的所有边界是否总是在VT-x模式下检查中断。

我不认为在来宾机中会有什么特别的原因。当外部中断到达时会发生什么。(假设我们讨论的是在管道上本机运行的来宾代码,而不是根代码模拟和/或决定延迟重新进入来宾代码,以防出现另一个中断。。请参阅注释。)

它们不会有效地阻止多条指令的中断;这会影响延迟。由于没有特殊的“同步点”,中断只能在那里传递,因此管道需要能够处理任意指令之间的中断。无序exec总是有很多潜在的问题,所以你不能指望在处理中断之前等待任何特定的状态;这可能需要太长时间。如果一对指令之间的间隙可以传递中断,为什么其他指令不能

CPU不重命名特权级别,因此它们会回滚到失效状态,放弃后端中的所有正在运行的指令,然后根据当前状态确定要执行的操作。另见


这个完全未经测试的猜测是基于我对CPU架构的理解。如果对中断延迟有可测量的影响,那可能是真的


在实践中,无论VT-X如何,一些指令边界可能无法中断,除非单步执行。

退役带宽是每时钟3个(Nehalem),每逻辑线程4个(Haswell),甚至在Skylake中更高。从无序核心中退役通常是突发性的,因为它是按顺序发生的(以支持精确的异常),这就是为什么我们有一个与预订站分离的ROB

很常见的情况是,一条指令会在一段时间内阻止稍后独立指令的失效,然后伴随该指令的一系列失效。e、 g.缓存未命中加载,或在某些独立指令之前的长dep链的末端

因此,对于某些函数或代码块,很可能每次运行时,
xor
-例如,归零指令总是在与之前的指令相同的周期内失效。这意味着CPU永远不会处于xor归零指令是最早的非失效指令的状态,因此它和之前的insn之间的间隙永远不会是出现中断的地方

如果有两条指令紧跟在一起,例如,在CPU从先前的指令返回用户空间后的一个周期中出现一条指令,最终,64字节I-cache边界处的前端效应可能会干扰廉价独立指令的通常模式,如
nop
xor
——归零总是在与较早的延迟更高的指令相同的周期内重新启动,但可能仍然存在不受干扰的情况,其中fetch和5-wide解码,4-wide-issue/rename将可靠地将指令一起输入管道,而不会在准备退役后,在快速指令完成之前完成慢指令


正如我所说,这并不是针对VT-x的。

我理解你的要求,但标题和第一段具有高度误导性。“可中断指令”是一种可以在执行中中断的指令。正如您所知,中断通常发生在指令之间。很少有x86指令是可中断的。(我只想到了rep字符串说明,但我似乎记得还有另外一个。)我为标题不清楚表示歉意。我将尝试重写它。@prl:其他包括AVX2/AVX512聚集/分散,其中已完成元素的掩码向量被清除。它们的速度很慢,可能需要触发多个页面错误,因此对于同步异常,即使在处理页面错误会取消所有其他页面映射的病态条件下,这也能保证向前进行。但更相关的是,它意味着避免在中间元素页面出错时重做TLB未命中,并且在异步中断到达时不放弃工作。类似于
rep
字符串指令。有一个较长版本的评论。并讨论了“收集部分进度”如何缩小最坏情况下的工作集大小以取得进展。在虚拟化设备的环境中,这很可能是不同的。如果root注意到对来宾中的虚拟设备的访问,那么它可能会在不同的边界上传递/生成虚拟中断,而不是在