Chinaunix首页 | 论坛 | 博客
  • 博客访问: 992629
  • 博文数量: 153
  • 博客积分: 4195
  • 博客等级: 上校
  • 技术积分: 2631
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-22 11:32
文章存档

2012年(7)

2010年(35)

2009年(111)

分类:

2009-11-17 16:22:25

最近碰到一个处理器的问题,问题很复杂,现象看来是linux在应用程序执行,在换页的时候表项出了问题。但是很难调试,总的目的是通过应用程序的正确页的虚拟地址找到接下来一页(错误页)的物理地址。
 
总的思路:
1.通过正确页的虚拟地址(可以得到程序的代码)-》2.将运行的代码和物理内存中所有的数据进行比较,得到该正确页的物理地址的代码-》3.通过物理地址的前20位作为索引,在内存中找到该页对应的页表项-》4.根据相邻页页表项应该相邻的原则,得到下一页(也就是我们的错误页)的页表项-》5.通过该页表项得到物理地址。
 
使用axd的注意点:
第一步中在mem窗口中看到的:

[0xe51b001c]   ldr      r0,[r11,#-0x1c]

[0xe24bd00c]   sub      r13,r11,#0xc

[0xe89da800]   ldmia    r13,{r11,r13,pc}

[0xe1a0c00d]   mov      r12,r13

[0xe92ddc10]   stmfd    r13!,{r4,r10-r12,r14,pc}

[0xe24cb004]   sub      r11,r12,#4

[0xe24dd034]   sub      r13,r13,#0x34

[0xe59fa27c]   ldr      r10,0x4030e280

前面的方框里面就是这条指令的机器码,待会就用这个和物理地址中的数据比较。

 

第二步:

此时axd是打开mmu,cache的,不能就这样dump sdram的数据,先要通过reg窗口的cp15来把mmu,cache禁止,然后把sdram中的数据dump出来,发现一个很好玩的事情,对于linux来说,应用程序好像先用后8M(我的内存是32M),如果程序大,再顺序往前挪。通过UltraEdit来进行查找,注意字节摆放顺序。

 

通过这种方式,我只要知道代码的机器码,我就能找到它的物理地址,即使当中有mmu,哈哈哈,这种方式对一些特定场合的调试还是很有帮助,留下此文,以备不时只需。

 

 
阅读(1886) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~