vmlinux 反汇编_ARM Linux内核驱动异常定位方法分析--反汇编方式
通常认为,产生异常的地址是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内核驱动异常定位方法分析--反汇编方式相关推荐
- 嵌入式 Linux 内核驱动开发【The first day: 36093万字】
嵌入式 Linux 内核驱动开发[1] 嵌入式 Linux 内核驱动开发前言 第1章 Linux 内核裁剪和定制 [1]Linux 内核开发简介 [2] Linux 源码阅读工具 [1.2.1]Sou ...
- Linux内核驱动开发(一)
Linux内核初探 linux操作系统历史 开发模式 git 分布式管理 git clone 获取 git push 提交 git pull 更新 邮件组 mailing list patch 内核代 ...
- linux内核下网络驱动流程,基于Linux内核驱动的网络带宽测速方法与流程
本发明涉及一种测速方法,尤其是一种网络带宽测速方法. 背景技术: :电信运营商为客户提供一定带宽的Internet接入:为了检验带宽是否达标,一般均由客户使用个人电脑在网页上直接测速.但是随着智能网关 ...
- 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 ...
- 树莓派Linux内核编译、文件系统、Linux内核驱动基础框架、驱动测试步骤、总线地址
树莓派高阶开发课程 1. ubuntu18.04版本安装 让程序猿搭建环境太搞笑了,轻松easy! ========================================= ...
- linux内核单步调试,Linux内核驱动开发之KGDB单步调试内核(kgdboc方式)
如何单步调试Linux内核一直困扰着linux驱动开发人员,内核有其代码量大.逻辑复杂.与硬件交互的特性.因此,有着不同于应用程序的调试方法,据统计Linux内核开 Linux内核驱动开发之KGDB原 ...
- linux内核创建字符节点,Tiny6410学习ing—(四)、嵌入式Linux内核驱动进阶—(7)、高级字符设备驱动(自动创建节点)—#931...
按照国嵌的视频教程上来说的,最后就是-自动创建设备文件! 其实我感觉以前完全可以直接是手动创建了设备文件,然后就可以直接讲述自动创建设备文件,为啥非要拖到最后来讲述,我也就不清楚了!! 不管了,写完收 ...
- linux内核添加spi驱动,Linux内核驱动之spi子系统spi协议.docx
Linux内核驱动之spi子系统spi协议 概况 SPI接口是摩托罗拉首先提出的全双工三线同步串行外围接口SCK,MOSI,MISO,采用主从模式(Master Slave)架构:支持多slave模式 ...
- 树莓派基于Linux内核驱动开发详解
一.驱动认知 首先理解Linux内核框图 文件系统认知,Linux内核框图 1.什么是驱动 linux内核驱动.软件层面上的驱动 广义上是指:这一段代码操作了硬件去动,所以这一段代码就叫硬件的驱动程序 ...
最新文章
- Apache2 之虚拟主机设置指南
- 08 ORA系列:ORA-01861 文字与格式字符串不匹配
- python学习HTML之CSS(2)
- SWT外观:自定义FlatScrollBar颜色等
- mysql grant proxy on_MySQL 5.7权限的介绍
- Linux 网卡驱动学习(九)(层二转发)
- 游戏玩家都不爱 Windows 11?网友:没必要,Windows 10 足矣
- spring-retry小结
- 这四行棘手的C代码背后的概念
- matlab中产生对角阵,关于matlab中的diag函数(矩阵对角元素的提取和创建对角阵)
- Air应用:Splus微博,wing微博
- pdf转换器注册码及pdf转换器使用步骤
- linux种子搜索关键字,基于 DHT 网络的磁力链接和BT种子的搜索引擎架构
- 标准二维表问题 (卡特兰数)
- verilog中tb仿真文件模板
- vim 安装插件及常用插件
- 拖放排序列表JS插件---SortableJS使用教程
- 通信运营商:适合你吗?
- java判断一天是星期几_java判断今天星期几
- java.lang.RuntimeException: Unable to get provider android.support.v4.content.FileProvider
热门文章
- 画图怎么调整速度_初学者画图不流畅,线条毛躁生硬,而且手总抖怎么破?
- sqlplus几个存储过程执行变量值窜掉了_基于大数据的冷连轧过程控制优化技术研究...
- sht20温湿度传感器原理图_温湿度传感器在孵化行业怎么应用
- TCPIP / 粘包和拆包的定义以及解决办法
- Tiniux 3.0 / Memory.c / OSMemFree
- php $conf,$conf
- 公益性岗位计算机考试内容,公益性岗位公共基础知识:计算机概述-计算机硬件系统(1)...
- java multivaluemap_java – 使用自定义值集合类型创建Commons Collections MultiValueMap
- 张家港职称计算机应用能力考试,2016年江苏张家港计算机应用能力考试零基础备考...
- 动能如何转化成力_带式污泥压滤机的压力如何为液体的流动提供动能?