[Android稳定性] 第032篇 [原理篇] 高通平台 OCP & 组合键 Warm Reset 机制详解 9月前 评论
[Android稳定性] 第032篇 [原理篇] 高通平台 OCP & 组合键 Warm Reset 机制详解

本文深入探讨了Qualcomm平台Android系统中两种底层重启方式:OCP(过电流保护)触发的Warm Reset和通过组合键+Timer配置触发的Warm Reset。OCP是一种硬件保护机制,能监测供电轨是否过电流并执行Warm Reset。该重启不经过软件,重启后无last_kmsg记录。组合键+Timer配置则通过PMIC硬件监控按键状态,独立于软件,配置在Android启动后仍生效。两种重启方式均适合用于调试。

[Android稳定性] 第031篇 [原理篇] Linux内核内存检测工具KASAN 9月前 评论
[Android稳定性] 第031篇 [原理篇] Linux内核内存检测工具KASAN

Kasan(Kernel Address Sanitizer)是一个动态检测内存错误的工具,主要功能是检查内存越界访问和使用已释放的内存等问题。Kasan集成在Linux内核中,随Linux内核代码一起发布,并由内核社区维护和发展。在Android内核开发中,Android包括内核地址排错程序(KASan)。KASan是内核与编译时修改的组合,形成了一个插桩系统,可以实现更简单的bug发现和根本原因分析。KASan可以检测内核中许多类型的内存违规行为,包括堆栈、堆和全局变量中的出界读取和写入操作,并可检测释放后再使用和双重释放错误。

[Android稳定性] 第030篇 [问题篇] I2C bus hang 导致锁线程阻塞导致卡死 9月前 评论
[Android稳定性] 第030篇 [问题篇] I2C bus hang 导致锁线程阻塞导致卡死

本文分析了测试过程中出现的ANR问题,通过分析bugreport日志,发现大量内核线程卡在“不可中断睡眠”状态,表明线程正在等待I/O操作。进一步分析发现,问题可能出在电池/充电控制相关驱动上,因为涉及I²C通信和电源管理的模块出现异常。此外,fg_read_volt函数在I²C读失败后,会尝试重试,但可能因为互斥锁或I2C总线问题导致永久阻塞,进而引发系统内多个线程进入D状态。根本原因可能是I²C传输超时导致regmap_raw_read函数卡住或失败,进而导致fg_read_word和fg_read_volt函数卡住或多次失败,最终引发线程风暴。可能的原因包括硬件层面的I²C总线锁死、Fuel Gauge芯片异常、电池连接问题,以及软件层面的I²C驱动问题、多线程并发访问问题、I²C错误处理问题等。

[Android稳定性] 第027篇 [问题篇] 数组越界导致Unexpected kernel BRK exception at EL1 9月前 评论
[Android稳定性] 第027篇 [问题篇] 数组越界导致Unexpected kernel BRK exception at EL1

**摘要:** 在正常测试过程中,手机电池温度达到35度时,手机进入dump状态。问题分析显示,在`pd_policy_manager`模块的`usbpd_pm_workfunc`函数中出现了内核崩溃。进一步分析发现,`usbpd_pm_sm`函数在处理状态转换时,由于状态数组`pm_str`未包含`PD_PM_STATE_FC2_HOLD`,导致数组越界访问,引发崩溃。解决方案建议在`pm_str`数组中添加`PD_PM_STATE_FC2_HOLD`状态。

[Android稳定性] 第026篇 [方法篇] 在windows平台安装Linux ramdump parser工具 10月前 评论
[Android稳定性] 第026篇 [方法篇] 在windows平台安装Linux ramdump parser工具

本文介绍了在Windows环境下安装Python工具、获取Linux ramdump parser工具、编写解析脚本、编译工具链以及增加local_setting.py配置文件的过程。首先,安装Python并使用pip安装必要的库。接着,获取开源和专有的Linux ramdump parser工具并进行整合。然后,编写解析脚本并运行。此外,还需下载并整合gdb、nm和objdump工具链,最后在指定目录下增加local_setting.py文件以指定工具链路径。

[Android稳定性] 第025篇 [问题篇] KASAN slab-out-of-bounds内存越界问题 10月前 评论
[Android稳定性] 第025篇 [问题篇] KASAN slab-out-of-bounds内存越界问题

本文分析了在运行kasan版本corgi: 4967550时出现的死机问题,问题概率为4/7。通过分析dmesg日志,确定问题类型为slab-out-of-bounds,问题函数为usbpd_mi_vdm_received_cb,越界地址为ffffff808d6c0a60。通过trace32工具恢复现场,定位到死机原因为for循环中的数组越界访问。最终,通过修改循环次数为rx_msg->data_len/sizeof(u32),成功解决问题。

[Android稳定性] 第024篇 [方法篇] RCU Stall问题如何进行分析? 11月前 评论
[Android稳定性] 第024篇 [方法篇] RCU Stall问题如何进行分析?

RCU(读-复制-更新)是一种针对多核、多线程环境的内存同步机制,旨在解决读写并发问题,特别适用于读多写少的场景。RCU Stall是指RCU子系统检测到的问题,如宽限期未结束、回调堆积或调度延迟等,可能导致系统性能下降。分析RCU Stall的方法包括检查内核日志、任务栈回溯、长时间运行的任务、锁和资源争用等。实例中,通过dmesg日志分析和打开panic_on_rcu_stall来复现问题,并通过串口输出进程信息进行深入诊断。

[Android稳定性] 第023篇 [问题篇] printk非空的非法指针参数导致的spinlock死锁引起Non Secure WDT 11月前 评论
[Android稳定性] 第023篇 [问题篇] printk非空的非法指针参数导致的spinlock死锁引起Non Secure WDT

**摘要**: 本文分析了Linux内核中因`Non secure wdt`导致的死机问题。通过分析ramdump,发现所有CPU都在等待一个spin lock,且锁的持有者是`kworker/u17:12`。进一步分析发现,该进程在获取锁后出现了data abort,并在异常处理流程中再次尝试获取锁,导致死锁。根本原因是`nvt_update_firmware`函数中使用了未初始化的指针作为`printk`的参数,导致打印异常。解决方案是将`kmalloc`改为`kzalloc`,以确保内存被清零。实验验证了当`printk`的参数为非法指针时,会导致死锁。