Windows中文网

 找回密码
 立即注册
搜索
查看: 5624|回复: 0

调试寄存器与硬件断点

[复制链接]

19

主题

22

帖子

428

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
428
发表于 2022-10-6 15:52:04 | 显示全部楼层 |阅读模式
8086/8088提供普通断点指令INT3和单步跟踪标志TF,调试工具利用它们可以设置断点和实现单步。从80386开始,集成了调试寄存器,利用这些调试寄存器不仅可以设置代码执行断点,而且还可以设置数据访问断点;不仅可以把断点设置在RAM中,还可以把断点设置在ROM中,所以说,这些调试寄存器能提供调试便利、简化调试过程。
80486的调试功能包括了80386的调试功能并稍有扩充。关于普通断点指令和单步跟踪与8086/8088基本一致,本节主要介绍80486通过调试寄存器提供的支持调试能力。

80386和80486都支持6个调试寄存器,如下图所示。它们分别是断点地址寄存器DR0、DR1、DR2和DR3,调试状态寄存器DR6和调试控制寄存器DR7,DR4和DR5是系统保留的。
这些断点寄存器都是32位寄存器,利用调试寄存器数据传送指令,可以存取这些调试寄存器。但是必须注意,指令必须在特权级0或实地址模式下执行,所以只有在实模式或特权级0执行的程序才能设置断点和进行断点处理,那么我们需要写驱动吗?不需要,因为WIndows提供了相关API,使用API可以为目标程序设置断点。
111.jpg

1. 断点地址寄存器DR0、DR1、DR2和DR3
断点地址寄存器用于保存断点处的线性地址,处理器把当前执行指令处的线性地址和断点地址寄存器保存的的线性地址进行比较,判断当前所执行指令是否存在硬件断点。处理器具有4个断点地址寄存器DR0、DR1、DR2和DR3,所以可以同时支持4个这样的硬件断点,产生的异常是STATUS_SINGLE_STEP(单步异常)。
因为是通过调试寄存器来指示断点位置,而不是通过断点中断指令来指示断点位置,所以这些硬件断点可以设置在ROM中或者几个任务共享的代码中。


2. 调试控制寄存器DR7
调试寄存器DR7也称为调试控制寄存器,其各字段的意义如上图所示。它不仅控制是否允许断点,还控制各断点是代码执行断点还是数据访问断点(字节、字、双字)。DR7的各字段作用如下:
(1) 断点类型说明字段RW
DR7有4个RW字段,依次分别对应4个断点地址寄存器,RWi字段说明DRi寄存器所指示断点的类型,每一个RW占两位,“00”表示指令执行断点,“01”和“11”表示数据访问断点,见下表。
RW字段取值
断点类型(断点条件)
RW字段取值
断点类型(断点条件)
0 0
只执行
1 0
I/O端口断点
0 1
只写入数据
1 1
只读或写数据

(2) 断点长度说明字段
DR7有4个LEN字段,分别对应4个断点。LENi字段说明DRi寄存器所指示断点的长度(范围)。每一个LEN字段占两位,指令执行断点的断点长度必须为1字节;数据访问断点的断点长度可以是1字节、2字节或4字节。
LEN字段取值
断点长度(范围)
断点地址寄存器指示的断点地址
0 0
1字节
全部32位指示一个单字节的断点
0 1
2字节
最低1位被忽略,确定字对齐地址开始的2字节断点
1 0
保留
1 1
4字节
最低2位被忽略,确定双字对齐地址开始的4字节断点.
对于数据访问断点而言,断点长度说明字段LEN指示了断点的区域范围。例如,设DR1内的断点线性地址是XXXXXXX5H,当LEN1=00时,断点的区域范围只有1字节,地址就是XXXXXXX5H;当LEN1=01时,断点的区域范围是地址XXXXXXX4H到XXXXXXX5H的2字节(为什么是4到5而不是5到6,因为要字对齐);当LEN1=11时,断点的区域范围是地址XXXXXXX4H到XXXXXXX7H的4字节(为什么是4到7而不是5到8,因为要双字对齐)。当按RW所指示的数据访问断点方式访问存储单元位于断点范围内的字节时,就会中断。

(3) 全局和局部断点允许位
DR7有4个Gi和Li,分别对应4个断点。Gi和Li控制DRi所指示的断点在中断时,是否引起断点异常。当Gi或Li=1时,如果DRi所保存的地址处发生了数据访问断点,那么会导致进入向量号为1的调试异常;如果DRi所保存的地址处发生了指令执行断点,那么会导致引发向量号为1的调试故障。
Gi和Li分别称为全局断点允许位和局部断点允许位。在任务切换时,处理器清除各个Li位,所以Li位只支持一个任务范围内的断点。任务切换并不影响Gi位,所以Gi支持系统内各任务的断点。

(4) 精确数据访问断点相符位
DR7还有GE位和LE位,用于指示是否要求数据访问断点精确相符。80486及以后无论GE或LE是否置位,总是断点精确相符的。在80386中,可能出现数据访问断点不精确相符,通过设置GE位或LE位可以指示80386数据访问断点精确相符。在任务切换时,LE位被自动清除,所以LE位是任务局部的,任务切换时GE位不受影响,所以GE位是全局的。

(5) 全局调试寄存器访问检测位
DR7的位13是调试寄存器访问检测位GD。尽管只能在实方式或保护方式的特权级0时才能访问调试寄存器,但是GD位还提供对调试寄存器的特别保护。在GD=1的情况下,即使在实方式或保护方式的特权级0时,访问任何调试寄存器都会引起向量号为1的调试故障(int 1)。这种附加的保护特性保证调试程序在需要的时候可以完全控制调试寄存器资源。在进入向量号为1的异常处理程序时,自动地清除GD位,以便异常处理程序能自由地访问调试寄存器。


3. 调试状态寄存器DR6
调试寄存器DR6也称为调试状态寄存器,其各位的定义如上图所示。它指示断点原因,异常处理程序可以根据DR6的有关位,确定是数据访问断点、指令执行断点、单步或其他原因。
DR6内各指示位为1时所表示的意义如下:
■ Bi=1表示是由DRi所指示的断点引起的指令执行或数据访问调试异常。每当处理器在某个允许的断点i处发生中断,就设置DR6中的Bi为1,然后转入异常处理程序。
要特别注意,在某个允许的断点i处发生中断而设置Bi时,同时设置所有其他对应Bi位,而不论是否允许,因此,异常处理程序可能看到多个Bi被置位。
因为硬件断点同时只会触发一个,所以DR6的低4位最多只有一位被置1,所以在进入单步后,我们可以通过检测DR6的低4位是否有为1的位就可以判断该单步是否是因为硬件断点被断下的。如果是被硬件断点断下的,进而可以通过DR6的哪一位为1来判断是由DR0到DR3中的哪个断下的。
■ BD=1表示在GD置位的情况下访问调试寄存器,从而引起调试故障,在进入异常处理程序时,自动清除GD位。
■ BS=1表示由于单步原因进入调试异常。当标志寄存器EFLAGS中的单步标志TF置位时,一般每执行完一条指令以后就会进入异常处理程序,这就是单步。由于在进入异常处理程序时,自动清除TF标志,所以,异常处理程序里面指令的执行不会再单步。在异常处理程序结束时,中断返回指令IRET从堆栈中弹出原标志寄存器内容到标志寄存器,所以如果TF为1的话,那么又会产生单步。实际上,在执行置位TF指令的下一条指令(通常是IRET)之后才产生单步。
■ BT=1表示刚切换到任务状态段TSS中的调试异常标志T置位的任务。任务状态段TSS内安排了一个调试异常标志T,该标志T是任务状态段TSS内偏移64H处的字的最低位。在任务切换时,如果进入任务的T位为1,那么通常在任务切换完成之后,新任务的第一条指令执行之前进入调试异常,也即进入异常处理程序,这也称为任务切换自陷。

请注意,硬件根据上述各种情况设置调试状态寄存器DR6中的相应标志,但硬件并不自动淸除它们。所以,异常处理程序一般应该在返回前清除DR6,以免发生混淆。

4. 调试故障和调试陷阱的区别
调试异常分为调试故障和调试陷阱两类。数据访问断点、单步和任务切换自陷属于调试陷阱。调试陷阱是在执行引起异常的指令之后发生,进入调试陷阱时,保存在堆栈中的返回地址指向引起陷阱的指令的下一条要执行指令。调试故障是在引起异常的指令之前发生,进入调试故障时,堆栈中的返回地址指向引起故障的指令。

标志寄存器EFLAGS中的重启动标志RF能控制是否产生调试故障,在把RF置成1后,下一条指令的任何调试故障被忽略。通常每当成功地执行完一条指令,那么RF被清0。但IRETD指令例外,它能根据堆栈中标志寄存器映像的RF位设置RF。异常处理程序能利用这一特性,在返回断点处时不再重复产生断点故障。

回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则

QQ|Archiver|手机版|小黑屋|Windows中文网 ( 鲁ICP备2021014210号 )

GMT+8, 2025-6-9 19:21 , Processed in 0.085182 second(s), 28 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表