android 行 64,android缺陷分析:内核空指针
高通Android 7.1平台出现内核崩溃,log如下:
(红色是关键信息)
[ 65.862388] msm_isp_get_buf: bug mgr open cnt = 0
[ 65.871767] Unable to handle kernel NULL pointer dereference at virtual address 00000000
[ 65.879833] pgd = ffffffc02718f000
[ 65.883217] [00000000] *pgd=0000000000000000
[ 66.148672] , *pud=0000000000000000
[ 66.152318] Internal error: Oops: 96000005 [#1] PREEMPT SMP
[ 66.157870] Modules linked in: wlan(O) streamax_jiami(O)
[ 66.163169] CPU: 0 PID: 3450 Comm: AVStreamManager Tainted: G W O 3.18.31 #9
[ 66.171063] Hardware name: Qualcomm Technologies, Inc. MSM8953 QRD NOPMI SKU3 (DT)
[ 66.178618] task: ffffffc012672940 ti: ffffffc027188000 task.ti: ffffffc027188000
[ 66.186092]PC is at msm_isp_cfg_ping_pong_address+0x240/0x5fc
[ 66.191898] LR is at msm_isp_cfg_ping_pong_address+0x214/0x5fc
[ 66.197714]pc : [(ffffffc00088ebb0>] lr : [(ffffffc00088eb84>] pstate: 000001c5
[ 66.205093] sp : ffffffc02718b9f0
[ 66.208391] x29: ffffffc02718b9f0 x28: ffffffc067765098
[ 66.213686] x27: ffffffc067760000 x26: 0000000000000003
[ 66.230003] x25: 0000000000000003 x24: ffffffc067764ec8
[ 66.235299] x23: ffffffc067764648 x22: 0000000001000300
[ 66.240595] x21: 0000000000000000 x20: 0000000000000000
[ 66.245890] x19: ffffffc067764ec8 x18: 0000000000000000
[ 66.251185] x17: 0000000000000000 x16: ffffffc0002021a0
[ 66.256481] x15: 0000000000000000 x14: 0ffffffffffffffe
[ 66.261775] x13: 0000000000000038 x12: 0101010101010101
[ 66.267071] x11: 7f7f7f7f7f7f7f7f x10: 5e6f72685e6c726c
[ 66.272364] x9 : 7f7f7f7f7f7f7f7f x8 : 6e63206e65706f20
[ 66.277660] x7 : 72676d2067756220 x6 : ffffffc001b027cc
[ 66.282955] x5 : 0000000000000000 x4 : 0000000000000000
[ 66.288251] x3 : 0000000000000000 x2 : cb88537fdc8cb01f
[ 66.293546] x1 : cb88537fdc8cb01f x0 : 0000000000000001
[ 66.298844]
[ 66.298844] PC: 0xffffffc00088eab0:
[ 66.303789] eab0 b9414800 34000160 7100109f 54000128 f9400760 d2804314 f9401801 2a1903e0
[ 66.705352]
[ 66.706829]Process Stream (pid: 3450, stack limit = 0xffffffc027188058)
[ 66.714293] Call trace:
[66.716728][(ffffffc00088ebb0>] msm_isp_cfg_ping_pong_address+0x240/0x5fc
[66.723583][(ffffffc00088f034>] msm_isp_init_stream_ping_pong_reg+0xc8/0x138
[ 66.730700] [(ffffffc000890670>] msm_isp_cfg_axi_stream+0x37c/0xdfc
[ 66.736954] [(ffffffc00088ac64>] msm_isp_ioctl+0x520/0xc08
[ 66.742424] [(ffffffc0008a2a74>] msm_isp_subdev_do_ioctl+0xf0/0xfc
[ 66.748585] [(ffffffc0007e30c8>] video_usercopy+0x2d4/0x574
问题分析
1、反编译内核
aarch64-linux-android-objdump -S -l -z vmlinux > vmlinux.txt
aarch64-linux-android-objdump:prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/aarch64-linux-android-objdump
vmlinux是带符号表的kernel:out/target/product/msm8953_64/obj/KERNEL_OBJ/vmlinux。需要在内核config加入: CONFIG_DEBUG_INFO=y CONFIG_DEBUG_INFO_REDUCED=y。
2、在vmlinux.txt中找到PC地址对应的代码行
/home3/liutao2/8953_MG/SLM758C_AIBOX2/8953_MG/kernel/msm-3.18/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c:1726
return buf;
if (buf->num_planes != stream_info->num_planes) {
ffffffc00088ebac: 39403260 ldrb w0, [x19,#12]
ffffffc00088ebb0: b9400281 ldr w1, [x20]
ffffffc00088ebb4: 6b00003f cmp w1, w0
ffffffc00088ebb8: 54ffff20 b.eq ffffffc00088eb9c (msm_isp_cfg_ping_pong_address+0x22c>
问题点在文件msm_isp_axi_util.c的1726行代码
if (buf->num_planes != stream_info->num_planes) {
在vmlinux.txt查找函数msm_isp_cfg_ping_pong_address的PC地址:
ffffffc00088e970 (msm_isp_cfg_ping_pong_address>:
msm_isp_cfg_ping_pong_address():
/home3/liutao2/8953_MG/SLM758C_AIBOX2/8953_MG/kernel/msm-3.18/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c:1815
msm_isp_cfg_ping_pong_address的PC地址是ffffffc00088e970,msm_isp_cfg_ping_pong_address+0x240 =ffffffc00088ebb0
3、代码分析
函数msm_isp_cfg_ping_pong_address代码段:
rc = vfe_dev->buf_mgr->ops->get_buf(vfe_dev->buf_mgr,
vfe_dev->pdev->id, bufq_handle, buf_index,&buf);
if (rc == -EFAULT) {
msm_isp_halt_send_error(vfe_dev, ISP_EVENT_BUF_FATAL_ERROR);
return buf;
}
if (rc < 0)
return buf;
if (buf->num_planes != stream_info->num_planes) {
pr_err("%s: Invalid buffer\n", __func__);
vfe_dev->buf_mgr->ops->put_buf(vfe_dev->buf_mgr,
bufq_handle, buf->buf_idx);
buf = NULL;
}
从问题行if (buf->num_planes != stream_info->num_planes)判断buf或者stream_info为NULL,阅读代码逻辑后stream_info不会是NULL。rc >= 0时,走到问题代码行。
再看get_buf函数:
static int msm_isp_get_buf(struct msm_isp_buf_mgr *buf_mgr, uint32_t id,
uint32_t bufq_handle, uint32_t buf_index,
struct msm_isp_buffer **buf_info)
{
......
// open_count == 0,返回0
if (buf_mgr->open_count == 0) {
pr_err_ratelimited("%s: bug mgr open cnt = 0\n",
__func__);
return 0;
}
......
// buf != NULL,返回0
if (!(*buf_info)) {
rc = -ENOMEM;
} else {
(*buf_info)->state = MSM_ISP_BUFFER_STATE_DEQUEUED;
rc = 0;
}
}
问题出现在open_count == 0,再看内核日志,有bug mgr open cnt = 0的log。确认了获取的buf是NULL。
解决方法
if (buf_mgr->open_count == 0) {
pr_err_ratelimited("%s: bug mgr open cnt = 0\n", __func__);
- return 0;
+ return rc;
}
android 行 64,android缺陷分析:内核空指针相关推荐
- android行高,android – GridView的行高
如何使行高适合GridView中最高的项目? 因为默认情况下它是失败的. 更新: 这里是网格布局 android:layout_width="fill_parent" androi ...
- android 行居中,android自己定义换行居中CenterTextView
在我们开发app时,TextView一定是使用最多的控件了,android自带的TextView的功能也十分强大.但还是有些小的地方不能满足我们的需求.几天要说的这个功能也是开发中非经常见的.就是,在 ...
- Android uevent进程源码分析
在Android Init进程源码分析中讲到init进程会依次执行被加入到待执行队列action_queue中的Action,在init.rc中我们有这么一段配置: 11 on early-init1 ...
- Android手机一键Root原理分析(作者:非虫,文章来自:《黑客防线》2012年7月)
之前几天都在做Android漏洞分析的项目,万幸发现了这篇文章.废话不多说,上文章! <Android手机一键Root原理分析> (作者:非虫,文章来自:<黑客防线>2012年 ...
- CVE-2014-7911 Android本地提权漏洞分析与利用
概述 前面我们了解了Android Binder机制的基本原理,当然仅仅了解是不够的,我们要做到:Know it and hack it.这篇文章我们就来分析一个和Binder相关的漏洞:CVE-20 ...
- 基于Android系统的IPv6网络接入分析
基于Android系统的IPv6网络接入分析 摘 要:本文深入分析了 ...
- Android KitKat 外部存储权限分析
不知道你有么有发现,来自菜鸟的成长史:http://blog.csdn.net/zjbpku/article/details/25161131, KitKat之后的版本不再支持用户对外置SDcard( ...
- 手机Android存储性能优化架构分析
引子 自己做单机存储性能优化工作已经一年多了,平时组内做的优化点需要系统总结一下了. 怎么能够找到手机存储性能优化方面的技术特性,怎么去凸显手机存储里面碰到的独特性能优化问题,有了这些需求,所以我需要 ...
- Android O 安卓启动时间优化分析
文档转载自AOSP官网 本文档提供了有关改进特定 Android 设备的启动时间的合作伙伴指南.启动时间是系统性能的重要组成部分,因为用户必须等待启动完成后才能使用设备.对于较常进行冷启动的汽车等设备 ...
最新文章
- Codeforces 458A Golden System
- Linux内核--网络协议栈深入分析(一)--与sk_buff有关的几个重要的数据结构
- arthas使用示例:trace追踪方法调用路径及统计方法耗时
- 南师大632c语言程序设计,单片机c语言学习心得632.docx
- python赋值语句的作用_Python之语句与函数
- linux 内核互斥体,内核并发控制---互斥量
- Android HWUI硬件加速模块浅析
- 源码编译CWM Recovery
- 概率图模型-原理与技术 第二章 基础知识 学习笔记
- 全网最全软件版本号相关内容科普
- 柯美文件服务器,柯尼卡美能达复印机共享SMB文件扫描
- 怎么制作表情DIY,动态GIF表情包如何制作?
- 【学习方法】 高效记忆秘籍,背书轻松开挂!3个方法专治记不住忘得快,让你像喝水一样高效学习!
- 侯捷C++八部曲笔记(二、STL标准库和泛型编程)
- wsl 1 ubuntu 安装图像化界面
- Thinkphp开发无需挂机开源版本支付系统原码带云端ZFB和WX免输入金额跳转支付
- TensorRT加速
- 政策理解优化,安徽省碳达峰碳中和领域科技项目申报领域条件要求方式流程要点
- Google Web App开发指南
- 工信部备案新规则下,关于域名核验的相关问题