加入收藏 | 设为首页 | 会员中心 | 我要投稿 温州站长网 (https://www.52wenzhou.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

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

发布时间:2020-12-26 16:24:16 所属栏目:Linux 来源:网络整理
导读:像GDB这样的调试功能通过设置eflags寄存器的TF标志来工作,这会在处理器每次执行指令后导致异常,让gdb等工具控制调试.当我们运行虚拟机时,如果是kvm则执行同样你需要设置一个名为MONITOR TRAP FLAG的标志(当前英特尔软件手册3c第15页),这将导致虚拟macine在每

像GDB这样的调试功能通过设置eflags寄存器的TF标志来工作,这会在处理器每次执行指令后导致异常,让gdb等工具控制调试.当我们运行虚拟机时,如果是kvm则执行同样你需要设置一个名为MONITOR TRAP FLAG的标志(当前英特尔软件手册3c第15页),这将导致虚拟macine在每条指令给出管理程序之后进行EXIT(VMEXIT).

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

我在某地读到,其原因是如果使用EFLAGS,访客可以将VMM的(管理程序)意图覆盖为单步.

答:如果你没有控制权,那么模仿硬件的重点是什么?

B:我正面临一个问题,我需要设置BTF(分支陷阱标志)(PG 689 vOLUME 3a INTEL sotfware手册).在正常情况下,这会导致每个分支指令出现DEBUG EXCEPTION,但由于我想在VM上执行此操作,因此我无法确定要在VMCS中设置哪个位.在单步执行的情况下似乎没有直接的方法.任何人都可以让我知道如果有某种方法使用其他方法做同样的事情?

谢谢

解决方法

不,没有Branch Monitor Trap Flag.

英特尔可能会制造一个,但却没有.

细节

让我们首先通过并定义术语:

[请注意,所有这些仅与英特尔x86相关]

陷阱旗帜(TF)

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

分支陷阱标志(BTF)

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

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

When software sets both the BTF flag (bit 1) in the IA32_DEBUGCTL MSR
and the TF flag in the EFLAGS register,the processor generates a
single-step debug exception only after instructions that cause a
branch.[1] This mechanism allows a debugger to single-step on control
transfers caused by branches. This “branch single stepping” helps
isolate a bug to a particular block of code before instruction
single-stepping further narrows the search. The processor clears the
BTF flag when it generates a debug exception. The debugger must set
the BTF flag before resuming program execution to continue
single-stepping on branches.

[1] Executions of CALL,IRET,and JMP that cause task switches never
cause single-step debug exceptions (regardless of the value of the BTF
flag). A debugger desiring debug exceptions on switches to a task
should set the T flag (debug trap flag) in the TSS of that task. See
Section 7.2.1,“Task-State Segment (TSS).”

监控陷阱标志(MTF)

MTF位于VMCS中,在guest虚拟机中触发某些指令边界上的Monitor Trap Flag VMEXIT.

一般来说,只要访客正在进行前进就会发生退出,并且没有任何东西会出现比MTF VMEXIT更高优先级的主机端.存在奇怪的边缘情况,例如REP MOV(可以被中断的指令)和SMI(对于主机OS是不可见的中断).有关详细信息,请参阅SDM的Monitor Trap Flag部分(2016年4月25.5.2).

回应

Why do we need a seperate flag in the VMCS (virtual Macine control
Structure) when such a flag is already present in the architecture
(EFLAG)?

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

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

… Can anyone let me know If there some way to do the same thing
using other means?

没有Branch Monitor陷阱标志.您可以通过查看来宾的RIP(应该在VMCS中)中的解码指令来实现等效的东西,但这需要一堆额外的VMEXITS.显然,这并不理想.

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

每当访客VMEXIT接下来,BTF将被破坏,如果它尚未被调试异常清除(IA32_DEBUGCTL在退出时被清除).您可以使用MSR LOAD / STORE列表保存该值,但这并不能完成.

(编辑:温州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读