• 标 题: 讲讲Dr6和Dr7的用途
  • 作 者:forgot
  • 时 间:004-06-06,18:32
  • 链 接:http://bbs.pediy.com

引用:
最初由 老王 发布
讲讲Dr6和Dr7的用途吧!
这里这样:
and [ecx].iDr6, 0FFFF0FF0h ; CONTEXT.iDr6 = 0FFFF0FF0h
and [ecx].iDr7, 0DC00h ; CONTEXT.iDr7 = 0DC00h
这里又这样:
and [ecx].iDr6, 0FFFF0FF0h
mov [ecx].iDr7, 155h 


   |---------------|----------------|
Dr6|                              |BBB                       BBB B |
   |                              |TSD                     3 2 1 0 |
   |---------------|----------------|
Dr7|RWE LEN   ...      RWE LEN    |  G                  GLGLGLGLGL |
   | 3   3    ...      0    0     |  D            E E 3 3 2 21 100 |
   |---------------|----------------|
31                               15                                0

Dr0~3用于设置硬件断点,即在调试器中经常使用的bpm断点,由于只有4个断点寄存器,所以最多只能设置4个bpm断点。Dr7是一些控制位,用于控制断点的方式,Dr6用于显示是哪些引起断点的原因,如果是Dr0~3或单步(EFLAGS的TF)或由于GD置位时访问调试寄存器引起1号调试陷阱的话,则相应设置对应的位。下面对Dr6和Dr7的对应位做一些详细介绍:

调试控制寄存器Dr7:
==========
位0 L0和位1 G0:用于控制Dr0是全局断点还是局部断点,如果G0置位则是全局断点,L0置位则是局部断点。
G1L1~G3L3用于控制D1~Dr3,其功能同上。

LEN0:占两个位,开始于位15,用于控制Dr0的断点长度,可能取值:
    00   1字节
    01  2字节
    10   保留
    11  4字节
RWE0:从第17位开始,占两个位,控制Dr0的断点是读、写还是执行断点或是I/O端口断点:
    00  只执行
    01  写入数据断点
    10  I/O端口断点(只用于pentium+,需设置CR4的DE位)
    11  读或写数据断点
RWE1~3,LEN1~3分别用于控制Dr1~3的断点方式,含义如上。

还有一个GD位:用于保护DRx,如果GD位为1,则对Drx的任何访问都会导致进入1号调试陷阱。即IDT的对应入口,这样可以保证调试器在必要的时候完全控制Drx。

调试状态寄存器Dr6:
=========
该寄存器用于表示进入陷阱1的原因,各个位的含义如下:
B0~B3,如果其中任何一个位置位,则表示是相应的Dr0~3断点引发的调试陷阱。但还需注意的是,有时候不管GiLi如何设置,只要是遇到Drx指定的断点,总会设置Bi,如果看到多个Bi置位,则可以通过GiLi的情况判断究竟是哪个Dr寄存器引发的调试陷阱。
BD置位表示是GD位置位情况下访问调试寄存器引发的陷阱。
BT置位表示是因为TS置位即任务切换时TSS中TS位置1时切到第二个任务时第一条指令时引发的。
BS置位表示是单步中断引发的断点。。。。即EFLAGS的TF置位时引发的调试陷阱。

注意I/O端口断点是586+以上CPU才有的功能,受CR4的DE位的控制,DE为1才有效。(DE是CR4的第3位)。