Debugging 虚拟内存可以用来支持i386中的数据断点功能吗?
我在我的操作系统教科书中提到虚拟地址转换可以在数据断点上实现(用于程序调试)。我只知道调试器使用INT3暂停程序,本地和全局变量以某种方式在调试控制和地址寄存器中进行处理。但经过一些挖掘,我只在调试寄存器的使用中找到了关于线性地址的信息。根本没有关于虚拟地址相关数据断点背后的机制的文章或讨论。那么这到底是如何工作的呢 用x86术语来说,线性地址是虚拟的。x86内存寻址: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]手动覆盖,则
- 像
到“有效地址”(seg:off的偏移部分)的寻址模式。(例如,如果不使用[ebp+eax*4]
手动覆盖,则每个寻址模式都意味着一个段。通常情况下,除非基址寄存器是R/E/BP或R/ESP,在这种情况下,基址寄存器是[fs:rdi]
。对于作为指令一部分的隐式寻址模式,例如,或,它取决于指令。)SS
- seg:off->linear,将线段基准添加到偏移
- 将线性地址转换为物理地址。(如果是虚拟化,则从来宾物理到真实物理。)
我只知道调试器使用INT 3暂停程序 “硬件断点”表示CPU将停止,而软件不必将执行代码重写为
0xCC int3
。调试寄存器可以做到这一点,还可以检测任何指令对特定内存位置的访问
因此,当程序在内存中读取或写入某个全局变量时,可以将观察点设置为中断,让您找到通过指针或其他方式修改它的代码。由于它支持硬件,您可以全速运行,而无需单步执行,并让软件检查每次访问
另见
- 英特尔手册
- 像
到“有效地址”(seg:off的偏移部分)的寻址模式。(例如,如果不使用[ebp+eax*4]
手动覆盖,则每个寻址模式都意味着一个段。通常情况下,除非基址寄存器是R/E/BP或R/ESP,在这种情况下,基址寄存器是[fs:rdi]
。对于作为指令一部分的隐式寻址模式,例如,或,它取决于指令。)SS
- seg:off->linear,将线段基准添加到偏移
- 将线性地址转换为物理地址。(如果是虚拟化,则从来宾物理到真实物理。)
我只知道调试器使用INT 3暂停程序 “硬件断点”表示CPU将停止,而软件不必将执行代码重写为
0xCC int3
。调试寄存器可以做到这一点,还可以检测任何指令对特定内存位置的访问
因此,当程序在内存中读取或写入某个全局变量时,可以将观察点设置为中断,让您找到通过指针或其他方式修改它的代码。由于它支持硬件,您可以全速运行,而无需单步执行,并让软件检查每次访问
另见
- 英特尔手册