高通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缺陷分析:内核空指针相关推荐

  1. android行高,android – GridView的行高

    如何使行高适合GridView中最高的项目? 因为默认情况下它是失败的. 更新: 这里是网格布局 android:layout_width="fill_parent" androi ...

  2. android 行居中,android自己定义换行居中CenterTextView

    在我们开发app时,TextView一定是使用最多的控件了,android自带的TextView的功能也十分强大.但还是有些小的地方不能满足我们的需求.几天要说的这个功能也是开发中非经常见的.就是,在 ...

  3. Android uevent进程源码分析

    在Android Init进程源码分析中讲到init进程会依次执行被加入到待执行队列action_queue中的Action,在init.rc中我们有这么一段配置: 11 on early-init1 ...

  4. Android手机一键Root原理分析(作者:非虫,文章来自:《黑客防线》2012年7月)

    之前几天都在做Android漏洞分析的项目,万幸发现了这篇文章.废话不多说,上文章! <Android手机一键Root原理分析> (作者:非虫,文章来自:<黑客防线>2012年 ...

  5. CVE-2014-7911 Android本地提权漏洞分析与利用

    概述 前面我们了解了Android Binder机制的基本原理,当然仅仅了解是不够的,我们要做到:Know it and hack it.这篇文章我们就来分析一个和Binder相关的漏洞:CVE-20 ...

  6. 基于Android系统的IPv6网络接入分析

                                                                      基于Android系统的IPv6网络接入分析 摘 要:本文深入分析了 ...

  7. Android KitKat 外部存储权限分析

    不知道你有么有发现,来自菜鸟的成长史:http://blog.csdn.net/zjbpku/article/details/25161131, KitKat之后的版本不再支持用户对外置SDcard( ...

  8. 手机Android存储性能优化架构分析

    引子 自己做单机存储性能优化工作已经一年多了,平时组内做的优化点需要系统总结一下了. 怎么能够找到手机存储性能优化方面的技术特性,怎么去凸显手机存储里面碰到的独特性能优化问题,有了这些需求,所以我需要 ...

  9. Android O 安卓启动时间优化分析

    文档转载自AOSP官网 本文档提供了有关改进特定 Android 设备的启动时间的合作伙伴指南.启动时间是系统性能的重要组成部分,因为用户必须等待启动完成后才能使用设备.对于较常进行冷启动的汽车等设备 ...

最新文章

  1. Codeforces 458A Golden System
  2. Linux内核--网络协议栈深入分析(一)--与sk_buff有关的几个重要的数据结构
  3. arthas使用示例:trace追踪方法调用路径及统计方法耗时
  4. 南师大632c语言程序设计,单片机c语言学习心得632.docx
  5. python赋值语句的作用_Python之语句与函数
  6. linux 内核互斥体,内核并发控制---互斥量
  7. Android HWUI硬件加速模块浅析
  8. 源码编译CWM Recovery
  9. 概率图模型-原理与技术 第二章 基础知识 学习笔记
  10. 全网最全软件版本号相关内容科普
  11. 柯美文件服务器,柯尼卡美能达复印机共享SMB文件扫描
  12. 怎么制作表情DIY,动态GIF表情包如何制作?
  13. 【学习方法】 高效记忆秘籍,背书轻松开挂!3个方法专治记不住忘得快,让你像喝水一样高效学习!
  14. 侯捷C++八部曲笔记(二、STL标准库和泛型编程)
  15. wsl 1 ubuntu 安装图像化界面
  16. Thinkphp开发无需挂机开源版本支付系统原码带云端ZFB和WX免输入金额跳转支付
  17. TensorRT加速
  18. 政策理解优化,安徽省碳达峰碳中和领域科技项目申报领域条件要求方式流程要点
  19. Google Web App开发指南
  20. 工信部备案新规则下,关于域名核验的相关问题

热门文章

  1. 智能手表ticwatch穿戴体验
  2. YYModel源码心得
  3. Wdatepicker日期控件的使用指南 (转)
  4. linux键盘关机方法,【Linux】正确的关机方法
  5. 解方程之直接开平方法
  6. 彻底卸载MySQL Connector Net
  7. 校园跑腿管理端APP—陕西格创
  8. SFTP子系统申请已拒绝请确保SSH连接的SFTP子系统设置有效
  9. RuleEngineListener和RuleListener区别
  10. Oracle Explan