通常认为,产生异常的地址是lr寄存器的值,从上面的异常信息可以看到[lr]的值是c01a4e30。

接下来,我们可以通过内核镜像文件反汇编来找到这个地址。内核编译完成后,会在内核代码根目录下生成vmlinux文件,我们可以通过以下命令来反汇编:

arm-none-eabi-objdump -Dz -S vmlinux >linux.dump

值得注意的是,arm-none-eabi-objdump的参数-S表示尽可能的把原来的代码和反汇编出来的代码一起呈现出来,-S参数需要结合arm-linux-gcc编译参数-g,才能达到反汇编时同时输出原来的代码。所以,我在linux内核代码根目录的Makefile中增加-g编译参数:

KBUILD_CFLAGS := -g -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \

-fno-strict-aliasing -fno-common \

-Werror-implicit-function-declaration \

-Wno-format-security \

-fno-delete-null-pointer-checks

修改Makefile后,重新编译内核,在根目录中生成的vmlinux文件就会包含了原来的代码信息,因此,该文件的大小也比原来大一倍!

最后执行“arm-none-eabi-objdump -Dz-S vmlinux >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 sub sp, sp, #28 ; 0x1c

c01a4e28: e1a04000 mov r4, 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 bl c01a44b8

c01a4e30: e3500000 cmp r0, #0 ; 0x0

c01a4e34: e5943034 ldr r3, [r4, #52]

c01a4e38: 0a00007b beq c01a502c

可以看出来,异常的产生位于atmel_tasklet_func函数的 else if (atmel_use_dma_tx(port))一行。

估计atmel_use_dma_tx(port)的“port”参数为空指针所致!

最后,我把串口的DMA功能去掉,改为直接传送,这样做虽然效率低了点,但产生异常的现象消失了。

关键字:ARM atmel SAM9x25 Linux内核驱动异常 调试 反汇编 objdump

vmlinux 反汇编_ARM Linux内核驱动异常定位方法分析--反汇编方式相关推荐

  1. 嵌入式 Linux 内核驱动开发【The first day: 36093万字】

    嵌入式 Linux 内核驱动开发[1] 嵌入式 Linux 内核驱动开发前言 第1章 Linux 内核裁剪和定制 [1]Linux 内核开发简介 [2] Linux 源码阅读工具 [1.2.1]Sou ...

  2. Linux内核驱动开发(一)

    Linux内核初探 linux操作系统历史 开发模式 git 分布式管理 git clone 获取 git push 提交 git pull 更新 邮件组 mailing list patch 内核代 ...

  3. linux内核下网络驱动流程,基于Linux内核驱动的网络带宽测速方法与流程

    本发明涉及一种测速方法,尤其是一种网络带宽测速方法. 背景技术: :电信运营商为客户提供一定带宽的Internet接入:为了检验带宽是否达标,一般均由客户使用个人电脑在网页上直接测速.但是随着智能网关 ...

  4. Linux内核驱动之efi-rtc

    Linux内核驱动之efi-rtc 1. UEFI与BIOS概述 1.1. BIOS 概述 1.1.1. BIOS缺点: 1.1.2. BIOS的启动流程 1.2 UEFI 概述 1.2.1 Boot ...

  5. 树莓派Linux内核编译、文件系统、Linux内核驱动基础框架、驱动测试步骤、总线地址

    树莓派高阶开发课程 1. ubuntu18.04版本安装          让程序猿搭建环境太搞笑了,轻松easy! ========================================= ...

  6. linux内核单步调试,Linux内核驱动开发之KGDB单步调试内核(kgdboc方式)

    如何单步调试Linux内核一直困扰着linux驱动开发人员,内核有其代码量大.逻辑复杂.与硬件交互的特性.因此,有着不同于应用程序的调试方法,据统计Linux内核开 Linux内核驱动开发之KGDB原 ...

  7. linux内核创建字符节点,Tiny6410学习ing—(四)、嵌入式Linux内核驱动进阶—(7)、高级字符设备驱动(自动创建节点)—#931...

    按照国嵌的视频教程上来说的,最后就是-自动创建设备文件! 其实我感觉以前完全可以直接是手动创建了设备文件,然后就可以直接讲述自动创建设备文件,为啥非要拖到最后来讲述,我也就不清楚了!! 不管了,写完收 ...

  8. linux内核添加spi驱动,Linux内核驱动之spi子系统spi协议.docx

    Linux内核驱动之spi子系统spi协议 概况 SPI接口是摩托罗拉首先提出的全双工三线同步串行外围接口SCK,MOSI,MISO,采用主从模式(Master Slave)架构:支持多slave模式 ...

  9. 树莓派基于Linux内核驱动开发详解

    一.驱动认知 首先理解Linux内核框图 文件系统认知,Linux内核框图 1.什么是驱动 linux内核驱动.软件层面上的驱动 广义上是指:这一段代码操作了硬件去动,所以这一段代码就叫硬件的驱动程序 ...

最新文章

  1. Apache2 之虚拟主机设置指南
  2. 08 ORA系列:ORA-01861 文字与格式字符串不匹配
  3. python学习HTML之CSS(2)
  4. SWT外观:自定义FlatScrollBar颜色等
  5. mysql grant proxy on_MySQL 5.7权限的介绍
  6. Linux 网卡驱动学习(九)(层二转发)
  7. 游戏玩家都不爱 Windows 11?网友:没必要,Windows 10 足矣
  8. spring-retry小结
  9. 这四行棘手的C代码背后的概念
  10. matlab中产生对角阵,关于matlab中的diag函数(矩阵对角元素的提取和创建对角阵)
  11. Air应用:Splus微博,wing微博
  12. pdf转换器注册码及pdf转换器使用步骤
  13. linux种子搜索关键字,基于 DHT 网络的磁力链接和BT种子的搜索引擎架构
  14. 标准二维表问题 (卡特兰数)
  15. verilog中tb仿真文件模板
  16. vim 安装插件及常用插件
  17. 拖放排序列表JS插件---SortableJS使用教程
  18. 通信运营商:适合你吗?
  19. java判断一天是星期几_java判断今天星期几
  20. java.lang.RuntimeException: Unable to get provider android.support.v4.content.FileProvider

热门文章

  1. 画图怎么调整速度_初学者画图不流畅,线条毛躁生硬,而且手总抖怎么破?
  2. sqlplus几个存储过程执行变量值窜掉了_基于大数据的冷连轧过程控制优化技术研究...
  3. sht20温湿度传感器原理图_温湿度传感器在孵化行业怎么应用
  4. TCPIP / 粘包和拆包的定义以及解决办法
  5. Tiniux 3.0 / Memory.c / OSMemFree
  6. php $conf,$conf
  7. 公益性岗位计算机考试内容,公益性岗位公共基础知识:计算机概述-计算机硬件系统(1)...
  8. java multivaluemap_java – 使用自定义值集合类型创建Commons Collections MultiValueMap
  9. 张家港职称计算机应用能力考试,2016年江苏张家港计算机应用能力考试零基础备考...
  10. 动能如何转化成力_带式污泥压滤机的压力如何为液体的流动提供动能?