Dee*_*ght 5 linux gdb kvm intel virtual-machine
像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手册).在正常情况下每个分支指令,但因为我想这对VM这项事业调试异常,我无法推测其位在VMCS设置.在单步执行的情况下似乎没有直接的方法.任何人都可以让我知道如果有某种方法使用其他方法做同样的事情?
谢谢
英特尔可能会制造一款,但没有。
\n\n让我们首先回顾并定义术语:
\n\n[请注意,所有这些仅与 Intel x86 相关]
\n\n如问题中所述,在执行指令后导致 #DBG(通过异常 0x1 捕获)。\n使用 RFLAGS 的位 8 进行控制。
\n\nTLDR:BTF 将 TF 的行为修改为仅触发分支上的异常。
\n\n来自英特尔 SDM 2016 年 4 月版:
\n\n\n\n\n当软件同时设置 IA32_DEBUGCTL MSR 中的 BTF 标志(位 1)和 EFLAGS 寄存器中的 TF 标志时,处理器仅在导致分支的指令之后生成单步调试异常。[1] 此机制允许调试器单步执行由分支引起的控制传输。此 \xe2\x80\x9c 分支单步\xe2\x80\x9d 有助于\n 在指令\n 单步进一步缩小搜索范围之前将错误隔离到特定的代码块。处理器在生成调试异常时会清除\n BTF 标志。调试器必须在恢复程序执行之前设置 BTF 标志,以继续在分支上单步执行。
\n\n[1] 导致任务切换的 CALL、IRET 和 JMP 执行绝不会导致单步调试异常(无论 BTF 标志的值是多少)。想要在切换到任务时调试异常的调试器应该在该任务的 TSS 中设置 T 标志(调试陷阱标志)。请参阅\n 第 7.2.1 节,\xe2\x80\x9c 任务状态段 (TSS)。\xe2\x80\x9d
\n
MTF 是 VMCS 中的一个位,用于在来宾中时在某些指令边界上触发监视器陷阱标志 VMEXIT。
\n\n一般来说,只要来宾正在前进,并且主机端没有发生比 MTF VMEXIT 优先级更高的事情,就会发生退出。有一些奇怪的边缘情况,例如 REP MOV(可以中断的指令)和 SMI(对主机操作系统不可见的中断)。有关详细信息,请参阅 SDM 的“监视器陷阱标志”部分(2016 年 4 月的 25.5.2)。
\n\n\n\n\n当架构中已经存在这样的标志 (EFLAG) 时,为什么我们需要在 VMCS(虚拟机控制结构)中使用单独的标志?
\n
主机和来宾状态需要分开。如果您正在调试运行 GDB 的 guest 虚拟机,则主机需要能够触发 VMEXIT,而不是 guest 虚拟机内的异常。请注意,当设置陷阱标志时,默认情况下会在当前上下文中触发异常(如果您在来宾中运行,则为来宾的异常;如果您在主机中运行,则为主机的异常)。
\n\n主机可以尝试在不使用 MTF 的情况下进行调试,方法是使用 VMCS 中的异常位图强制设置来宾的 TF 并在调试异常上配置 VMEXIT。不幸的是,如果来宾也启用了调试异常,则主机没有干净的方法来知道调试异常属于谁(如果我没记错的话,则无法在写入 RFLAGS 时退出)。MTF 的存在使得调试运行调试器的 VM 成为可能。
\n\n\n\n\n...任何人都可以让我知道是否有办法使用其他方式做同样的事情\n?
\n
没有分支监视器陷阱标志。您可以通过查看来宾 RIP 中的解码指令(应该位于 VMCS 中)来实现等效的操作,但这需要大量额外的 VMEXITS。显然,这并不理想。
\n\n如果您在进入客人之前设置 BTF,事情很快就会变得混乱。它将被视为访客的 BTF,而不是与主机相关的 BTF。如果在VMCS中也设置了MTF,则BTF不会延迟MTF VMEXIT。另一方面,它会延迟来宾的下一个调试陷阱。
\n\n每当来宾 VMEXIT 下一次时,如果 BTF 尚未被调试异常清除(IA32_DEBUGCTL 在退出时被清除),则 BTF 将被破坏。您可以使用 MSR LOAD/STORE 列表保存该值,但这并没有多大作用。
\n 归档时间: |
|
查看次数: |
1952 次 |
最近记录: |