ARM Linux内核驱动异常定位方法分析反汇编方式
修改Makefile后,重新编译内核,在根目录中生成的vmlinux文件就会包含了原来的代码信息,因此,该文件的大小也比原来大一倍!
最后执行“arm-none-eabi-objdump -Dz-Svmlinux >linux.dump”,由于加入了-g编译参数,执行这个反汇编命令需要很长时间(本人在虚拟机上执行,花了近6个小时!),反汇编出来的linux.dump文件也比原来的44MB增大到惊人的503MB。
接下来可以用UltraEdit打开linux.dump文件,查找“c01a4e30”字符串。
最后定位到的信息是:
==================================================================================================================
/*
* tasklet handling tty stuff outside the interrupt handler.
*/
static void atmel_tasklet_func(unsigned long data)
{
c01a4e20:e92d45f0 push{r4, r5, r6, r7, r8, sl, lr}
c01a4e24:e24dd01c subsp, sp, #28; 0x1c
c01a4e28:e1a04000 movr4, r0
/* The interrupt handler does not take the lock */
spin_lock(&port->lock);
if (atmel_use_pdc_tx(port))
atmel_tx_pdc(port);
else if (atmel_use_dma_tx(port))
c01a4e2c:ebfffda1 blc01a44b8
c01a4e30:e3500000 cmpr0, #0; 0x0
c01a4e34:e5943034 ldrr3, [r4, #52]
c01a4e38:0a00007b beqc01a502c
==================================================================================================================
可以看出来,异常的产生位于atmel_tasklet_func函数的else if (atmel_use_dma_tx(port))一行。
估计atmel_use_dma_tx(port)的“port”参数为空指针所致!
最后,我把串口的DMA功能去掉,改为直接传送,这样做虽然效率低了点,但产生异常的现象消失了。
到后面再仔细分析为什么会产生这个异常,彻底解决这个问题。
ARMLinux内核驱动异常定位反汇编方 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)