微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM Linux内核驱动异常定位方法分析反汇编方式

ARM Linux内核驱动异常定位方法分析反汇编方式

时间:11-09 来源:互联网 点击:

修改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功能去掉,改为直接传送,这样做虽然效率低了点,但产生异常的现象消失了。

到后面再仔细分析为什么会产生这个异常,彻底解决这个问题。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top