X86保护模式编程总结(8)

调试
一组调试寄存器保存了断点的存储器地址和I/O位置.断点可请求调试软件.原理是在存储器或I/O操作涉及这些地址中的某一个时就产生异常.调试寄存器支持指令断点和数据断点.
设置指令断点的方法的是用断点指令来取代正常指令.在执行断点时指令时调用调试程序.

支持调试的体系结构特性:
1,保留的调试中断向量: 指定在调试程序事件发生时被调用的某一过程或任务.
2,调试地址寄存器: 指定最多四个断点的地址
3,调试控制寄存器: 指定断点的存储器或I/O访问形式
4,调试状态寄存器: 报告在发生异常时起作用的条件
5,TSS的自陷位(T位): 若某任务的TSS中此位置1,则在试图执行到该任务的任务切换时产生调试异常.
6,恢复标志(RF): 抑制同一指令的多重异常
7,自陷标志(TF): 在指令每次执行后产生调试异常
8,断点指令: 调用调试程序(产生调试异常).该指令是设置代码断点的另一途经.在要有四个以上的断点或将断点置于源代码时尤其重要.
9,断点异常保留的中断向量: 在执行断点指令时调用一过程或任务
这些特性允许调试程序作为独立的任务或作为当前任务的一个过程被调用.可使用以下条件来调用调试程序:
1,任务切换至一特定任务.
2,执行断点指令
3,执行任意指令
4,执行特定地址上的指令
5,读或写特定存储器地址上的字节,字或双字
6, 写特定存储器地址上的字节,字或双字
7,输入特定I/O地址上的字节或字
8,输出特定I/O地址上的字节或字
9,试图改变调试寄存器的内容

断点字段识别: 四个断点条件中每一个的地址和LEN位定义了数据或I/G断点的串连字节的地址范围.LEN位允许规定一字节,两字节或四字节范围.I/O断点地址用0从16位扩充到32位,以便和所选调试寄存器中的断点地址比较.CPU强制这些需要,它使用LEN位来屏蔽调试寄存器的低地址位.未对齐的数据或I/O断点地址不会产所要的结果.
用于读或写的数据断点在以下情况下被触发:
参与访问的任意字节处于断点地址寄存器及其LEN位定义的范围内.

建议调试程序在返回被调试的程序前执行LGDT指令,以确保检测到断点.

调试异常
PentiumCPU中断向量中有两个留给调试异常.调试异常是调用为PentiumCPU专门设计的调试程序的一般途径.
中断1---调试异常
该异常的处理程序通常是调试程序或调试系统的一部分.CPU对几种条件中的任一种产生调试异常.调试程序可检测DR6和DR7寄存器中的标志.以确定哪个条件产生异常以及哪些其它条件也可能有关.
指令断点是故障,其它调试异常是自陷.
调试异常条件表:
被测标志说明
BS=1单步自陷
B0=1&(GE0=1|LE0=1)由DR0,LEN0和R/W0定义的断点
B1=1&(GE1=1|LE1=1)由DR1,LEN1和R/W1定义的断点
B2=1&(GE2=1|LE2=1)由DR2,LEN2和R/W2定义的断点
B3=1&(GE3=1|LE3=1)由DR3,LEN3和R/W3定义的断点
BD=1调试寄存器用于在线仿真
BT=1任务切换

系统软件必须使EFLAGS寄存器副本中的RF=1,该寄存器被推入调试异常处理例行程序的栈中.处理器在每条指令成功完成时清除RF标志,当在IRET指令以及引起任务切换的JMP,CALL或INT指令之后者除外.

数据断点是自陷,即CPU在执行访问断点存储器或I/O位置的指令之后产生断点异常.

单步自陷: 该自陷发生于执行指令前设置了TF标志时,在设置TF标志的指令后不发生异常.
CPU在调用异常处理程序前清除TF标志,如果在任务切换时在TSS中设置TF,则异常发生于新任务中第一条指令之后.(注意:INT指令将清除TF.所以软件调试程序中单步代码必须识别并仿真INT或INTO指令.而不是直接执行它们)

任务切换自陷: 调试异常还发生在新任务的TSS的T=1时进行任务切换之后.异常发生在控制已传给新任务之后,但在执行新任务的第一条指令之前.异常处理程序通过检查DR6的BT位可检测该条件.(注意,如果调试处理程序是一任务,则TSS的T位不应置位,否则CPU陷入死循环)

INT 3产生断点自陷: (此时断点异常仍被执行,在断点数过多或被置于正在开发的源码时很有用)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值