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

2024-05-05

除了不将中断传送到虚拟处理器的某些正常指定条件(cli、if=0 等)之外,客户机中的所有指令实际上都是可中断的吗?

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

背景是,使用模拟器对竞争条件和同步原语进行压力测试通常非常有价值。人们希望你的模拟器能够接收任何指令的中断,以触发“有趣的行为”。

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

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


我不明白为什么在客人里面会有什么特别的。当外部中断到来时会发生什么。 (假设我们谈论的是在管道上本机运行的来宾代码,而不是根模拟和/或决定延迟重新进入来宾以应对另一个中断。看评论。)

它们不会有效地阻止多条指令的中断;这会损害中断延迟。由于不存在只能在此处传递中断的特殊“同步点”,因此管道需要能够处理任意指令之间的中断。无序执行总是可能会发生很多事情,因此您不能指望在处理中断之前等待任何特定状态;这可能需要很长时间。如果一对指令之间的间隙可以传递中断,为什么其他指令不能呢?

CPU 不会重命名特权级别,因此它们会回滚到退休状态,丢弃后端所有正在执行的指令,然后根据当前状态确定要做什么。也可以看看当中断发生时,流水线中的指令会发生什么情况? https://stackoverflow.com/q/8902132


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


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

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

一条指令会阻止稍后的独立指令退出一段时间,然后与该指令一起突然退出,这是很常见的。例如缓存未命中加载,或某些独立指令之前的长依赖链的末尾。

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

如果您有两条紧密相连的指令,例如如果 CPU 从较早的指令返回到用户空间后的一个周期中出现,您可能最终会在 64 字节 I-cache 边界处产生前端效应,从而扰乱廉价独立指令的通常模式,例如nop or xor-归零始终在与早期较高延迟指令相同的周期中退出,但仍然可能存在不可干扰的情况,其中获取和 5 宽解码以及 4 宽发出/重命名将可靠地将指令一起放入管道中在准备退出后,没有机会让慢的人先于快的人完成。

正如我所说,这并不是 VT-x 特有的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 如何匹配特质实现者

    我有一个由某些结构实现的特征 我想编写一个模式匹配 可以处理每种可能的情况 trait Base struct Foo x u32 struct Bar y u32 impl Base for Foo impl Base for Bar f
  • 在 GitHub 上托管可执行文件?

    我想将可执行文件与我的源代码一起分发 我的源代码全部整齐地托管在 GitHub 上 是否可以将可执行文件和安装程序添加到我的 GitHub 项目页面 而不将它们添加到我的 git 存储库 请注意 由于某种原因 GitHub 停止了此功能 请
  • 如何使用 Spark 执行插入覆盖?

    我正在尝试将我们的 ETL Hive 脚本之一转换为 Spark 其中 Hive ETL 脚本维护一个表 其中需要在每晚新同步之前删除部分数据 Hive ETL 使用插入覆盖的方式将主表删除超过 3 天的数据 基本上创建一个临时表 其中的数
  • 支持多屏幕[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 支持多个屏幕和不同的屏幕密度必须注意
  • 计算集合中某种类型的对象并将其用作文本框中的字符串

    我想用集合中某种图形的 count 1 填充文本框 该集合是图形的通用列表 图形是某种类型的图形的实例 以下作品 txtName Text figures OfType
  • 为什么 LocationSettingsResult startResolutionForResult 不调用 onActivityResult?

    我看过这个问答LocationSettingsRequest 对话框 跳过 onActivityResult https stackoverflow com questions 31235564 locationsettingsreques
  • SharePoint DateTime 默认值尊重时区

    我有一个日期时间字段 仅限日期 它使用 今天的日期 作为默认值 但是 当用户将项目添加到列表时 选择的日期对应于 GMT 时区 因此 如果用户在 2012 年 2 月 22 日晚上 7 点 美国东部标准时间 添加项目 则默认值实际上将显示为
  • 修改rails ActiveAdmin gem中的BaseController

    我在 Rails 应用程序中使用 ActiveAdmin gem 如果我想添加一个适用于所有 activeadmin gem 的新的 before 过滤器 我该怎么做 我想我可以修改 ActiveAdmin 中的 BaseControlle
  • 如何在 django-tastypie 中获取授权用户对象

    我需要在水合物方法中获取授权用户对象 如下所示 class SalepointResource ModelResource def hydrate self bundle user bundle request user But reque
  • Go中funcappend的实现在哪里?

    我对 go 非常感兴趣 并尝试阅读 go 函数的实现 我发现其中一些函数没有实现 如追加或调用 The append built in function appends elements to the end of a slice If i
  • Twitter Bootstrap:仅将某些菜单项折叠到下拉菜单中

    我想知道如何创建 Twitter Bootstrapnavbar在调整浏览器窗口大小时折叠该菜单中的项目 一次折叠一个或两个项目 我见过的大多数导航栏都将整个导航栏折叠成一个下拉菜单 当窗口大小调整时 基本上隐藏了导航栏上的所有内容 但我仍
  • 在 package.json 中声明时 Reactify 转换未运行

    我正在尝试将reactify 转换与browserify 和gulp 结合使用 这个 gulp 任务有效 return browserify paths node modules app scripts entries app script
  • 如何将json从android发送到php?

    为了将 json 从 android 发布到 php 我使用了 Volley 库StringRequest目的 StringRequest sr new StringRequest Request Method POST url new R
  • 如何按日期属性对对象数组进行排序?

    假设我有一个由几个对象组成的数组 var array id 1 date Mar 12 2012 10 00 00 AM id 2 date Mar 8 2012 08 00 00 AM 如何按日期元素从最接近当前日期和时间的日期开始对该数
  • require未定义nodejs

    尝试使用此 smartsheet api http smartsheet platform github io api docs javascript node js sample code http smartsheet platform
  • 具有多个参数的 JavaScript 函数

    我有一个将数组作为输入的函数 我如何修改它以使用变量参数和数组 例如我想要arrSum 1 2 3 arrSum 1 2 3 回来true即两者都应该返回 6 const arrSum arr gt arr reduce a b gt a
  • 处理 Cloud Run 容器关闭

    在编写 Cloud Run 服务时 我们开发一个容器来监听PORT用于处理传入 HTTP 请求的环境变量 容器的实例会启动并处理请求 然后在完成原始请求后存活一段时间 以防有更多请求到达 如果没有进一步的请求 GCP关闭容器 我在这方面有一
  • 查看登录设备

    我想查看Log在设备上 即System out println 我可以查看DDMS但如何在运行时在设备屏幕上查看APK文件 还有一个适用于 Android 的 Logcat 应用程序 code google com p android ra
  • 如何安装适用于 Windows C++ 的最新版本 OpenGL?

    我正在使用 Visual Studio 2010 运行 Windows 7 包含的 OpenGL 版本 include 是版本 1 1 我希望使用合理的当前版本 某种版本 3 或 4 我需要做什么才能达到该状态 OpenGL SDK 页面位
  • 在 x86 Intel VT-X 非根模式下,是否可以在每个指令边界传递中断?

    除了不将中断传送到虚拟处理器的某些正常指定条件 cli if 0 等 之外 客户机中的所有指令实际上都是可中断的吗 也就是说 当传入的硬件中断先传递给 LAPIC 然后传递给处理器时 据说会发生一些内部魔法 将其转换为虚拟中断给来宾 使用虚