原创 一句话技术——变态的linux虚实调试技巧

2009-12-24 14:42 1325 1 1 分类: MCU/ 嵌入式
最近碰到一个处理器的问题,问题很复杂,现象看来是linux在应用程序执行,在换页的时候表项出了问题。但是很难调试,总的目的是通过应用程序的正确页的虚拟地址找到接下来一页(错误页)的物理地址。

 

总的思路:

1.通过正确页的虚拟地址(可以得到程序的代码)-》2.将运行的代码和物理内存中所有的数据进行比较,得到该正确页的物理地址的代码-》3.通过物理地址的前20位作为索引,在内存中找到该页对应的页表项-》4.根据相邻页页表项应该相邻的原则,得到下一页(也就是我们的错误页)的页表项-》5.通过该页表项得到物理地址。

 

使用axd的注意点:

第一步中在mem窗口中看到的:


[0xe51b<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />001c]   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,哈哈哈,这种方式对一些特定场合的调试还是很有帮助,留下此文,以备不时只需。

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
1
关闭 站长推荐上一条 /3 下一条