陷阱标志(TF)和监视器陷阱标志之间的区别?

2023-12-11

像 GDB 这样的调试功能通过设置 eflags 寄存器的 TF 标志来工作,这会在处理器每次执行指令后引发异常,让 gdb 等工具控制调试。当我们运行虚拟机 Ex 时,在 kvm 的情况下执行以下操作同样,您需要设置一个名为 MONITOR TRAP FLAG 的标志(当前英特尔软件手册 3c 第 15 页),这将导致虚拟机在每条指令后退出(VMEXIT),从而为虚拟机管理程序提供调试能力。

虚拟机管理程序可以设置虚拟机(来宾)的几乎任何位/寄存器。当架构 (EFLAG) 中已经存在这样的标志时,为什么我们需要在 VMCS(虚拟机控制结构)中使用单独的标志?

我在某处读到,这样做的原因是,如果使用 EFLAGS,guest 可以覆盖 VMM(管理程序)的单步意图。

A:如果你没有控制权,模拟硬件还有什么意义?

B:我遇到一个问题,需要设置 BTF(分支陷阱标志)(PG 689 vOLUME 3a INTEL 软件手册)。在正常情况下,这会导致每个分支指令出现调试异常,但由于我想在虚拟机上执行此操作,因此我无法确定要在 VMCS 中设置哪个位。似乎没有像单步执行那样直接的方法。谁能告诉我是否有办法使用其他方式做同样的事情?

Thanks


不,没有分支监视器陷阱标志。

英特尔可能会制造一款,但没有。

Details

让我们首先回顾并定义术语:

[请注意,所有这些仅与 Intel x86 相关]

陷阱标志 (TF)

如问题中所述,执行指令后会导致 #DBG(通过异常 0x1 捕获)。 使用 RFLAGS 的位 8 进行控制。

分支陷阱标志 (BTF)

TLDR:BTF 将 TF 的行为修改为仅触发分支上的异常。

来自英特尔 SDM 2016 年 4 月版:

当软件设置 IA32_DEBUGCTL MSR 中的 BTF 标志(位 1)时 和 EFLAGS 寄存器中的 TF 标志,处理器生成一个 仅在导致错误的指令之后才进行单步调试异常 分支。[1]这种机制允许调试器单步控制 分支机构引起的转移。这种“分支单步执行”有帮助 在指令之前将错误隔离到特定的代码块 单步进一步缩小搜索范围。处理器清除 生成调试异常时的 BTF 标志。调试器必须设置 在恢复程序继续执行之前的 BTF 标志 单步踩在树枝上。

[1] 导致任务切换的 CALL、IRET 和 JMP 的执行从不 导致单步调试异常(无论 BTF 的值是多少) 旗帜)。调试器希望在切换到任务时出现调试异常 应在该任务的 TSS 中设置 T 标志(调试陷阱标志)。看 第 7.2.1 节“任务状态段 (TSS)”。

监视器陷阱标志 (MTF)

MTF 是 VMCS 中的一个位,用于在来宾中时在某些指令边界上触发监视器陷阱标志 VMEXIT。

一般来说,只要来宾正在前进,并且主机端没有发生比 MTF VMEXIT 优先级更高的事情,就会发生退出。有一些奇怪的边缘情况,例如 REP MOV(可以中断的指令)和 SMI(对主机操作系统不可见的中断)。有关详细信息,请参阅 SDM 的“监视器陷阱标志”部分(2016 年 4 月的 25.5.2)。

回应

当架构 (EFLAG) 中已经存在这样的标志时,为什么我们需要在 VMCI(虚拟机控制结构)中添加一个单独的标志?

主机和来宾状态需要分开。如果您正在调试运行 GDB 的 guest 虚拟机,则主机需要能够触发 VMEXIT,而不是 guest 虚拟机内的异常。请注意,当设置陷阱标志时,默认情况下会在当前上下文中触发异常(如果您在来宾中运行,则为来宾的异常;如果您在主机中运行,则为主机的异常)。

主机可以尝试在不使用 MTF 的情况下进行调试,方法是使用 VMCS 中的异常位图强制设置来宾的 TF 并在调试异常上配置 VMEXIT。不幸的是,如果来宾也启用了调试异常,则主机没有干净的方法来知道调试异常属于谁(如果我没记错的话,则无法在写入 RFLAGS 时退出)。 MTF 的存在使得调试运行调试器的 VM 成为可能。

...谁能告诉我是否有办法做同样的事情 使用其他方式?

没有分支监视器陷阱标志。您可以通过查看来宾 RIP 中的解码指令(应该位于 VMCS 中)来实现等效的操作,但这需要大量额外的 VMEXITS。显然,这并不理想。

如果您在进入客人之前设置 BTF,事情很快就会变得混乱。它将被视为访客的 BTF,而不是与主机相关的 BTF。如果在VMCS中也设置了MTF,则BTF不会延迟MTF VMEXIT。另一方面,它会延迟来宾的下一个调试陷阱。

每当来宾 VMEXIT 下一次时,如果 BTF 尚未被调试异常清除(IA32_DEBUGCTL 在退出时被清除),则 BTF 将被破坏。您可以使用 MSR LOAD/STORE 列表保存该值,但这并没有多大作用。

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

陷阱标志(TF)和监视器陷阱标志之间的区别? 的相关文章

  • 怎样才能使 Windows 成为一个开箱即用的 POSIX 兼容操作系统?

    这个问题的动机是我的一个牵强的梦想 即 nix 平台上可用的许多优秀软件可以轻松移植到 Windows 微软最近对开源和开放性采取了不同的方法 所以我真的很想知道如果微软有这样的倾向 这样的事情会有多可行 我很好奇的一些更具体的事情是 是否
  • git在Windows和Linux之间切换后强制刷新索引

    我有一个Windows和Linux共享的磁盘分区 格式 NTFS 它包含一个 git 存储库 约 6 7 GB 如果我只使用Windows or 只使用Linux操作 git 存储库一切正常 但是每次切换系统的时候git status命令将
  • 标准头文件中的 C 编译器错误 - 未定义的 C++ 定义

    我正在尝试编译 C 程序 但收到许多错误 这些错误是在标准 C 头文件 inttypes h stdio h stat h 等 中遇到的 错误的来源是以下未定义的常量 BEGIN DECLS END DECLS BEGIN NAMESPAC
  • 无法执行'x86_64-conda_cos6-linux-gnu-gcc':没有这样的文件或目录(pysam安装)

    我正在尝试安装 pysam 执行后 python path to pysam master setup py build 这个错误的产生是 unable to execute x86 64 conda cos6 linux gnu gcc
  • Linux 中热插拔设备时检测设备是否存在

    我正在运行 SPIcode http lxr free electrons com source drivers spi spi omap2 mcspi c在熊猫板上 我想知道其中的哪个功能code http lxr free electr
  • 为 Qt 应用程序创建 Linux 安装

    我刚刚用 Qt Creator 制作了一个很棒的程序 我对自己很满意 如何将其从台式机移至笔记本电脑 那么 最好的方法是安装程序 对吗 对于 Ubuntu 这是一个 Debian 软件包 对吗 我怎么做 有人这样做过吗 他们可以分享 QT
  • 适用于 KDE 和 Gnome 的 Gui [重复]

    这个问题在这里已经有答案了 我想为一个现在是 CLI 的应用程序编写一个 gui 它需要在 KDE 和 Gnome DE 中 看起来不错 充分利用用户的外观设置 如果我选择 Qt 或 GTK 我能够做到这一点吗 它们与两个 DE 集成良好吗
  • 无需 cron 在后台发送邮件

    我想知道是否有一种方法可以运行 PHP 循环 以便在后台向订阅者发送几百封电子邮件 我的目标是格式化新闻通讯 单击发送 然后关闭浏览器或更改页面 当然 发送电子邮件的实际过程将在后台运行 不会因浏览器关闭而中断 我知道这可以通过 cron
  • 为什么 Linux 对目录使用 getdents() 而不是 read()?

    我浏览 K R C 时注意到 为了读取目录中的条目 他们使用了 while read dp gt fd char dirbuf sizeof dirbuf sizeof dirbuf code Where dirbuf是系统特定的目录结构
  • Composer 安装要求

    我正在尝试将 Composer 安装到 Laravel 项目中 当我做的时候sudo composer install在项目目录中它显示了两个错误 Problem 1 Installation request for simplesoftw
  • Fortran 在 gdb 中打印可分配数组

    我正在向开源科学代码添加一些功能 我使用很多可分配项 但在正确打印它们时遇到一些问题 例如 我声明并分配 然后使用 real dp allocatable psi n phi some other stuff here allocate p
  • 如何使用 sed 仅删除双空行?

    我找到了这个问题和答案 https stackoverflow com questions 4651591 howto use sed to remove only triple empty lines关于如何删除三重空行 但是 我只需要对
  • PHP 致命错误:未找到“MongoClient”类

    我有一个使用 Apache 的网站 代码如下 当我尝试访问它时 我在 error log 中收到错误 PHP Fatal Error Class MongoClient not found 以下是可能错误的设置 但我认为没有错误 php i
  • 如何模拟ARM处理器运行环境并加载Linux内核模块?

    我尝试加载我的vmlinux into gdb并使用 ARM 内核模拟器 但我不明白为什么我会得到Undefined target command sim 这是外壳输出 arm eabi gdb vmlinux GNU gdb GDB 7
  • Godaddy 托管上的 CakePHP 控制台

    我一直在努力让我的 CakePHP 网站在 Godaddy 网格托管 帐户上运行 我的蛋糕应用程序设置是从帐户的子目录托管的 并且可以通过子域访问 我必须调整我的 htaccess 文件才能使其正常工作 现在我需要让 CakePHP 控制台
  • ansible 重新启动 2.1.1.0 失败

    我一直在尝试创建一个非常简单的 Ansible 剧本 它将重新启动服务器并等待它回来 我过去在 Ansible 1 9 上有一个可以运行的 但我最近升级到 2 1 1 0 并且失败了 我正在重新启动的主机名为 idm IP 为 192 16
  • 为什么我收到的数据包数据大小大于mss?

    我在两台 PC 上使用 ifconfig ethX mtu 300 修改了 MTU 并使用 netperf 测试网络 我用 WireShark 嗅探了 SYN 数据包中的 MSS 260 但我得到了一些大于 260 的数据包 为什么 嗅探器
  • 在 Mac OS X 上构建 Linux 内核

    我正在做一个修改Linux内核的项目 我有一台桌面 Linux 机器 在上面构建内核没有问题 不过 我要去旅行 我想在途中工作 我只有一台 MacBook 当我尝试构建 Linux 内核时 它抱怨说elf h was not found 我
  • Elasticsearch 无法写入日志文件

    我想激活 elasticsearch 的日志 当我运行 elasticsearch 二进制文件时 我意识到我在日志记录方面遇到问题 无法加载配置 这是输出 sudo usr share elasticsearch bin elasticse
  • 创建 jar 文件 - 保留文件权限

    我想知道如何创建一个保留其内容的文件权限的 jar 文件 我将源代码和可执行文件打包在一个 jar 文件中 该文件将在使用前提取 人们应该能够通过运行批处理 shell 脚本文件立即运行示例和演示 然后他们应该能够修改源代码并重新编译所有内

随机推荐

  • PHP 转换 HTML 格式的日期

    从 Twitter 搜索 API Atom Feed 返回的发布日期为 2008 11 03T21 30 06Z 需要将其转换为 X 秒 分钟 小时 天前 以显示 Twitter 消息发布的时间 您认为这可以通过使用 DATE ATOM 值
  • R Shiny 动态选项卡编号和输入生成

    我当前的闪亮代码有问题 我必须根据给定函数的结果生成动态数量的选项卡 该部分工作正常 然后 我想在其他循环 例如 renderText 中生成这些选项卡的输入 但是 我生成的 renderText 的 textOutput 的最终输出始终是
  • 添加对 QuartzTypeLib 的程序集引用

    我是一名使用 Visual Studio 2008 的新程序员 如何添加对 QuartzTypeLib 的引用 我已经检查了添加引用文件夹 但在 net 或 com 参考库中没有看到 Quartz 的库 当尝试编译代码时 我收到一条错误 指
  • 将整数转换为实数的内部函数(16)

    将整数转换为四倍精度数的最佳方法是什么 对于双精度我使用 StrainStep MaximumStrain dble StrainIterations but now StrainStep and MaximumStrain are rea
  • 如何在 VB.NET 中从较大数组中获取子数组?

    I have Dim arr As String one two three 我想要一个新的数组 sub 仅包含 一 三 做到这一点的最佳方法是什么 对于这种特殊情况 最简单的选择就是列出要复制的两个项目 Dim sub arr 0 arr
  • 使用 Firebase 函数中的 Cloud SQL 代理

    我正在运行谷歌的云 SQL 代理在本地 它使用本地服务的 Firebase 功能 使用如下命令 cloud sql proxy instances my project 12345 us central1 my instance tcp 1
  • 如何在列表视图中拥有高级列表项

    我想让我的列表项看起来像这样 我有一个具有与其关联的 值的项目列表 这个布局看起来真的很吸引人 谁能告诉我如何做到这一点 这是我尝试过的代码
  • $.ajaxSetup 中的 beforeSend + $.ajax 中的 beforeSend

    为了解决 CSRF 问题 我使用 Ajax 客户端设置 ajaxSetup beforeSend function xhr settings function getCookie name var cookieValue null if d
  • Java 中的互斥量和信号量是什么?主要区别是什么?

    Java 中的互斥量和信号量是什么 主要区别是什么 不幸的是 每个人都忽略了信号量和互斥体之间最重要的区别 的概念 所有权 信号量没有所有权的概念 这意味着任何线程都可以释放信号量 这本身可能会导致许多问题 但有助于 死亡检测 而互斥体确实
  • 在 C/C++ 中写入非打印字符的行为是什么?

    如果字符是通过写入的 则写入非打印字符的行为是否未定义或实现定义printf fprintf 我很困惑 因为 C 标准 N1570 5 2 2 中的单词只讨论打印字符和字母转义序列的显示语义 另外 如果字符是通过写的呢 std ostrea
  • 检测SD卡硬件驱动器盘符

    有没有办法在 Windows 上以编程方式检测 SD 卡的驱动器盘符 该方法是否支持内部和外部 SD 卡硬件 感谢您的时间 你可以试试获取逻辑驱动器字符串获取驱动器号 然后使用获取驱动器类型查看驱动器是否可移动 然后您可以获得更多的设备信息
  • RSelenium 和 Javascript

    我对 R 相当精通 但对 javaScript 和其他语言完全一无所知 我想访问有关此公开数据集的信息 http fyed elections on ca fyed en form page en jsp 特别是 我在数据框中有一个包含数千
  • JQuery限制两个日期选择器之间的差异

    我有 2 个日期选择器 function DateFrom datepicker onSelect showUser minDate 90 maxDate 1D function DateTo datepicker onSelect sho
  • 如何使用 Spring MVC 和多种响应类型支持 JSONP

    我在控制器中有一个方法 它将根据要求返回 HTML 或 JSON 这是这种方法的一个精简示例 根据我在中找到的有关如何执行此操作的信息进行建模这个问题 RequestMapping value callback public ModelAn
  • 无法在 Jupyter Notebook 中导入 Tensorflow

    我尝试在 conda 环境中的 Jupyter 笔记本中导入 Tensorflow 模块 但出现以下错误 AttributeError type object h5py h5 H5PYConfig has no attribute redu
  • Unity3D - 在 Android 上接到任何呼叫/通知后音频播放变得静音

    我在 Android 版本上遇到音频播放问题 我使用的是 Unity 5 4 0b15 但我在 5 3 4p3 上遇到了同样的问题 我在场景中的 AudioPlayer 游戏对象中添加了用于播放背景音乐的简单组件 public AudioC
  • AS3中的实时更新和推送数据

    我想对我的 Flash 应用程序进行实时更新 我更喜欢推送技术 而不是每 30 秒刷新一次 在 Actionscript 3 中推送数据的最佳方式是什么 有两种流行的实现实时更新的选项 套接字和 RTMP 每种方法都有优点和缺点 但主要决定
  • 使用 JasperReports API 在代码中出现“java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory”

    我正在开发一个简单的独立桌面应用程序 它将根据传递给程序的值生成报告 没有数据库使用 我已经使用 iReport 设计器设计了 JasperReports 报表并添加了一个参数ID NO和一个带有表达式的文本字段 P ID NO 我可以成功
  • 无法修改全局 int,但可以修改列表。如何?

    列表 VAR1 0 def foo VAR1 1 返回VAR1 通话中foo 我收到此错误 UnboundLocalError local variable VAR1 referenced before assignment 但是 请考虑该
  • 陷阱标志(TF)和监视器陷阱标志之间的区别?

    像 GDB 这样的调试功能通过设置 eflags 寄存器的 TF 标志来工作 这会在处理器每次执行指令后引发异常 让 gdb 等工具控制调试 当我们运行虚拟机 Ex 时 在 kvm 的情况下执行以下操作同样 您需要设置一个名为 MONITO