可以使用虚拟内存来支持 i386 中的数据断点功能吗?

Tra*_* Su 1 debugging x86 assembly virtual-memory virtual-address-space

我潜伏在我的操作系统教科书中,它提到可以在数据断点上实现虚拟地址转换(用于程序调试)。我只知道调试器使用 INT 3 来暂停正在调试控制和地址寄存器中以某种方式处理的程序、局部和全局变量。但是经过一番挖掘,我只找到了有关使用调试寄存器的线性地址的信息。根本没有关于虚拟地址相关数据断点背后机制的文章或讨论。那么这究竟是如何工作的呢?

Pet*_*des 5

在 x86 术语中,线性地址虚拟的。 x86 内存寻址:

  • 寻址模式类似于[ebp + eax*4]“有效地址”(seg:off 的偏移部分)。(并且每个寻址模式都意味着一个段,如果您不手动覆盖,[fs: rdi]例如。通常DS,除非基址寄存器是 R/E/BP 或 R/ESP 在这种情况下SS。或者对于隐式寻址模式作为 egpush raxstosb,这取决于指令。)
  • seg:off -> 通过将段基数添加到偏移量来线性化。
  • 将该线性地址转换为物理地址。(如果是虚拟化,从访客物理到真正的物理。)

所有步骤都由 CPU 硬件完成,首先使用段基,然后使用 CR3 指向的页表。或者缓存来自该页表的翻译的 TLB。

硬件断点/观察点的硬件调试寄存器使用虚拟地址。 https://en.wikipedia.org/wiki/X86_debug_register解释如下:

这些寄存器中的地址是线性地址。如果启用分页,处理器的分页机制会将线性地址转换为物理地址。如果未启用分页,则这些线性地址与物理地址相同。

这意味着当您从放入调试寄存器的虚拟地址不同的虚拟地址访问相同的物理地址时,可以触发观察点。(如果维基百科上的描述是准确的;如果重要的话,我会测试它和/或检查英特尔或 AMD 的手册。)

我实际上并不知道细节;知道 x86 有一个 TF 标志和调试寄存器,以及它们可以做的事情的一般概念,但我从未编写过使用它们的代码。


我只知道调试器使用INT 3来暂停程序

“硬件断点”意味着 CPU 将停止,而无需软件将执行代码重写为0xCC int3. 调试寄存器可以做到这一点,还可以检测任何指令对某些内存位置的访问。

因此,当您的程序在内存中读取或写入某个全局变量时,您可以设置一个观察点来中断,让您找到通过指针或其他东西修改它的代码。而且由于它支持硬件,您可以全速运行,而不必单步执行并让软件检查每次访问。

也可以看看


归档时间:

查看次数:

283 次

最近记录:

4 年,6 月 前