Chinaunix首页 | 论坛 | 博客
  • 博客访问: 569262
  • 博文数量: 169
  • 博客积分: 2656
  • 博客等级: 少校
  • 技术积分: 1685
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-30 13:03
文章分类

全部博文(169)

文章存档

2011年(1)

2010年(135)

2009年(33)

我的朋友

分类: 嵌入式

2010-05-14 13:18:30

b

data access

Exception current instruction address:0x00460c88
Machine Status Register:0x0000b030
Data Access Register:0x00001314
Condition Register:0x40004084
Data storage interrupt Register:0x0a000000

507d9c vxTaskEntry    +68 : shell ()
4dc984 shell          +190: 4dc9b0 ()
4dcbb0 shell          +3bc: execute ()
4dcd34 execute        +d8 : yyparse ()
4f055c yyparse        +71c: 4ee8f4 ()
4eea78 yystart        +96c: b ()
4d8a48 b              +38 : 4d897c ()
4d89f0 dbgInit        +b4 : wdbDbgArchInit ()
508740 wdbDbgArchInit +4c : excVecSet ()
shell restarted.
 
 
使用 b 命令需要用到Trace异常,在指令执行到b后面的地址是触发异常进入处理程序从而完成跟踪功能。
具体到这个问题,应该是内存的开始部分被保护了,而异常Trace在0xb000就在这部分内,当初始化这部分功能的时候需要写Trace异常的地址,结果由于内存保护,引发了数据写异常。把保护去掉应该就可以了。
需要解释一下断点发生的流程,每次执行 b xxx 命令的时候是把一个断点的地址加到一个断点列表中,当指令地址与任何一个列表中的断点地址匹配时,将触发一个Trace异常,PC指针跳到0xb000执行。所以在0xb000的地方需要预先安装一个异常处理程序,安装的工作以及前面断点列表的初始化都由dbgInstall来完成。dbgInstall 并没有在初始化的时候调用,因为断点调试功能是一个可选的功能,并不是每个系统启动以后都会用到的,只有在使用的时候才会初始化。设计的时候在 dbgInstall里面加了一个静态变量保存状态,如果没有初始化则初始化一次,如果初始化过了就不再做具体事情。本问题发生的时刻应该在第一次使用b 命令的时候。
安装异常处理程序就需要更改0xb000的地址了,有时间可以看一下异常处理的代码,在一定偏移的地方,有一个跳转,所谓安装异常处理程序,实际上就是把异常处理程序的函数首地址写在跳转指令处。这个动作必然会修改内存。
阅读(798) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~