Linux 陷阱标志(TF)和监视器陷阱标志之间的差异?

Linux 陷阱标志(TF)和监视器陷阱标志之间的差异?,linux,gdb,virtual-machine,intel,kvm,Linux,Gdb,Virtual Machine,Intel,Kvm,GDB之类的调试功能通过设置eflags寄存器的TF标志来工作,该标志在处理器每次执行指令后都会导致异常,让GDB之类的工具控制调试。当我们在kvm中运行虚拟机Ex以执行相同的操作时,您需要设置一个名为MONITOR TRAP flag的标志(当前《英特尔软件手册》3c第15页),这将导致虚拟机退出(VMEXIT),在每条指令向虚拟机监控程序提供调试能力之后 虚拟机监控程序几乎可以设置VM(来宾)的任何位/寄存器。当架构(EFLAG)中已经存在这样的标志时,为什么我们需要在VMCS(虚拟机控制结

GDB之类的调试功能通过设置eflags寄存器的TF标志来工作,该标志在处理器每次执行指令后都会导致异常,让GDB之类的工具控制调试。当我们在kvm中运行虚拟机Ex以执行相同的操作时,您需要设置一个名为MONITOR TRAP flag的标志(当前《英特尔软件手册》3c第15页),这将导致虚拟机退出(VMEXIT),在每条指令向虚拟机监控程序提供调试能力之后

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

我在某个地方读到,这样做的原因是,如果使用了EFLAGS,来宾可以覆盖VMM(虚拟机监控程序)单步执行的意图

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

B:我面临一个需要设置BTF(分支陷阱标志)的问题(第689页第3a卷英特尔sotfware手册)。在正常情况下,这会导致每个分支指令出现调试异常,但由于我希望在VM上执行此操作,因此我无法确定在VMCS中设置哪个位。在单步执行的情况下,似乎没有直接的方法可以这样做。有人能告诉我是否有其他方法可以使用其他方法执行相同的操作吗

谢谢

否,没有分支监视器陷阱标志。 英特尔可能会制造一个,但没有

细节 让我们首先浏览并定义术语:

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

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

分支陷阱标志(BTF) TLDR:BTF修改TF的行为,只触发分支上的异常

从2016年4月版的英特尔SDM:

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

[1] 调用、IRET和JMP的执行会导致任务切换 导致单步调试异常(与BTF的值无关 标志)。调试器希望在切换到任务时出现调试异常 应在该任务的TSS中设置T标志(调试陷阱标志)。请参阅 第7.2.1节,“任务状态段(TSS)”

监视器陷阱标志(MTF) MTF是VMCS中的一个位,在来宾系统中,它在某些指令边界上触发监视器陷阱标志VMEXIT

一般来说,退出发生在客户机前进时,主机端没有比MTF VMEXIT优先级更高的事情发生。有一些奇怪的边缘情况,比如REP MOV(可以中断的指令)和SMI(主机操作系统看不见的中断)。有关详细信息,请参见传感和诊断模块SDM的监测陷阱标志部分(2016年4月25.5.2)

响应 为什么在VMCS(虚拟机控制)中需要单独的标志 结构)当此标志已存在于架构中时 (EFLAG)

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

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

…有没有人能告诉我有没有办法做同样的事情 使用其他方式

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

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


每当guest VMExit next退出时,如果BTF尚未被调试异常清除(IA32_DEBUGCTL在退出时被清除),则BTF将被关闭。您可以使用MSR加载/存储列表保存该值,但这并不能完成很多工作。

这接近于“过于本地化”地域。你可能应该试试英特尔的处理器支持论坛。@Jim Garrison请告诉我我可以在哪个论坛发布此消息……我应该试试KVM邮件列表吗……谢谢。我认为TF不会立即陷入陷阱的情况很少。但不知道这是否是原因。@Deepthink知道监视器陷阱标志f的对应部分是什么吗或者是AMD支持向量机?