Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Debugging 虚拟内存可以用来支持i386中的数据断点功能吗?_Debugging_Assembly_X86_Virtual Memory_Virtual Address Space - Fatal编程技术网

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

Debugging 虚拟内存可以用来支持i386中的数据断点功能吗?,debugging,assembly,x86,virtual-memory,virtual-address-space,Debugging,Assembly,X86,Virtual Memory,Virtual Address Space,我在我的操作系统教科书中提到虚拟地址转换可以在数据断点上实现(用于程序调试)。我只知道调试器使用INT3暂停程序,本地和全局变量以某种方式在调试控制和地址寄存器中进行处理。但经过一些挖掘,我只在调试寄存器的使用中找到了关于线性地址的信息。根本没有关于虚拟地址相关数据断点背后的机制的文章或讨论。那么这到底是如何工作的呢 用x86术语来说,线性地址是虚拟的。x86内存寻址: 像[ebp+eax*4]到“有效地址”(seg:off的偏移部分)的寻址模式。(例如,如果不使用[fs:rdi]手动覆盖,则

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

用x86术语来说,线性地址是虚拟的。x86内存寻址:

  • [ebp+eax*4]
    到“有效地址”(seg:off的偏移部分)的寻址模式。(例如,如果不使用
    [fs:rdi]
    手动覆盖,则每个寻址模式都意味着一个段。通常情况下,除非基址寄存器是R/E/BP或R/ESP,在这种情况下,基址寄存器是
    SS
    。对于作为指令一部分的隐式寻址模式,例如,或,它取决于指令。)
  • seg:off->linear,将线段基准添加到偏移
  • 将线性地址转换为物理地址。(如果是虚拟化,则从来宾物理到真实物理。)
所有步骤都由CPU硬件完成,首先使用段基,然后使用CR3指向的页表。或从该页表缓存翻译的TLB

硬件断点/监视点的硬件调试寄存器使用虚拟地址。解释如下:

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

这意味着,当您从不同于放入调试寄存器的虚拟地址访问同一物理地址时,可以触发监视点。(如果维基百科上的描述是准确的,我会对其进行测试和/或查看英特尔或AMD的手册,如果有必要的话。)

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


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

“硬件断点”表示CPU将停止,而软件不必将执行代码重写为
0xCC int3
。调试寄存器可以做到这一点,还可以检测任何指令对特定内存位置的访问

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

另见

  • 英特尔手册

用x86术语来说,线性地址是虚拟的。x86内存寻址:

  • [ebp+eax*4]
    到“有效地址”(seg:off的偏移部分)的寻址模式。(例如,如果不使用
    [fs:rdi]
    手动覆盖,则每个寻址模式都意味着一个段。通常情况下,除非基址寄存器是R/E/BP或R/ESP,在这种情况下,基址寄存器是
    SS
    。对于作为指令一部分的隐式寻址模式,例如,或,它取决于指令。)
  • seg:off->linear,将线段基准添加到偏移
  • 将线性地址转换为物理地址。(如果是虚拟化,则从来宾物理到真实物理。)
所有步骤都由CPU硬件完成,首先使用段基,然后使用CR3指向的页表。或从该页表缓存翻译的TLB

硬件断点/监视点的硬件调试寄存器使用虚拟地址。解释如下:

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

这意味着,当您从不同于放入调试寄存器的虚拟地址访问同一物理地址时,可以触发监视点。(如果维基百科上的描述是准确的,我会对其进行测试和/或查看英特尔或AMD的手册,如果有必要的话。)

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


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

“硬件断点”表示CPU将停止,而软件不必将执行代码重写为
0xCC int3
。调试寄存器可以做到这一点,还可以检测任何指令对特定内存位置的访问

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

另见

  • 英特尔手册


不清楚您的确切意思,但您可以取消映射或保护包含感兴趣地址的页面,以便在访问时出现页面错误,然后可以在调试器中处理。一个线性地址可以有多个不同的虚拟地址。任何有足够权限访问调试寄存器(38上的DR0-DR5)的程序