11月前
[Android稳定性] 第029篇 [问题篇] 数组越界导致Unexpected kernel BRK exception at EL1
在高低温测试中,两例设备死机问题指向charger模块。分析日志发现,问题源于`status_change_work`函数中的数组越界,可能与bitflip问题相关。解决方案建议增加兼容性代码,确保`cyclecount`值在0到800之间,防止异常值导致数组越界。
11月前
[Android稳定性] 第028篇 [问题篇] 可靠性滚筒测试中高概率自动关机问题记录
委外实验室AS2/AS4/AS5在滚筒测试中出现自动关机问题,惠州实验室AS1、AS3无此现象。分析发现LDO7触发OCP保护导致异常。验证方案将LDO7的OCP设置从LPM模式改为NPM模式,测试结果显示问题解决。
11月前
[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`状态。
11月前
[linux内存管理] 第023篇 watermark详解
本文探讨了 Linux 内存管理中的水位机制,特别是 `zoned page frame allocator` 如何使用水位来控制内存分配和回收。文章首先介绍了 `struct zone` 结构体和三种水位 `WMARK_MIN`、`WMARK_LOW` 和 `WMARK_HIGH` 的概念及其作用。随后,文章详细分析了水位的初始化过程,包括计算 `min_free_kbytes`、更新内存区水位、刷新内存区统计阈值和初始化低内存保留等步骤。接着,文章讨论了快速分配和慢速分配中的水位检测机制,以及 `kswapd` 和内存规整过程中的水位检测。最后,文章强调了调整内存水位的重要性,以及如何根据不同业务场景进行优化。
11月前
[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文件以指定工具链路径。
2025-02-27
[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),成功解决问题。
2025-02-19
[linux内存管理] 第022篇 buddy内存管理之慢速分配
延续对内核内存分配机制的深入解析,本文聚焦于`__alloc_pages`函数中的慢速分配流程。当快速分配失败后,系统会启用慢速路径,通过多种方式尝试获得所需页,包括直接回收、内存规整、唤醒kswapd线程与触发OOM机制。详细剖析了关键参数如`can_direct_reclaim`(是否允许回收)、`costly_order`(大块分配压力)、`__GFP_ATOMIC`滥用检查,以及规整与回收触发条件。代码层面揭示内存分配失败时的处理逻辑,强调高效而严谨的回退与重试机制,保证系统最大程度完成分配需求,并在极端情况下输出详细警告。
2025-02-18
[Android稳定性] 第024篇 [方法篇] RCU Stall问题如何进行分析?
RCU(读-复制-更新)是一种针对多核、多线程环境的内存同步机制,旨在解决读写并发问题,特别适用于读多写少的场景。RCU Stall是指RCU子系统检测到的问题,如宽限期未结束、回调堆积或调度延迟等,可能导致系统性能下降。分析RCU Stall的方法包括检查内核日志、任务栈回溯、长时间运行的任务、锁和资源争用等。实例中,通过dmesg日志分析和打开panic_on_rcu_stall来复现问题,并通过串口输出进程信息进行深入诊断。
2025-02-18
[linux内存管理] 第021篇 buddy内存管理之快速分配
深入解析Linux buddy分配器的alloc_pages核心算法,详述内存分配的“快速分配”与“慢速分配”流程。通过源码剖析,呈现alloc_pages如何高效处理内存请求,包括gfp标志、NUMA节点选择、碎片优化及分配策略,突出快速分配优先从zone链表获取空闲页,未命中时转入慢速路径处理.
2025-02-11
[linux内存管理] 第020篇 Linux内核slab内存的越界检查SLUB_DEBUG的原理剖析
越界访问常引发难以定位的系统异常,尤其在驱动开发中隐蔽性极高。SLUB DEBUG通过在分配内存对象周围设置特殊区域和magic数,有效检测越界(OOB)、用后即弃(UAF)等问题。借助Red zone和padding机制,能精准发现内存溢出及链表破坏,搭配slabinfo工具主动触发检测。
2025-02-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`的参数为非法指针时,会导致死锁。
2025-01-20
[Android稳定性] 第022篇 [原理篇] kernel panic的死亡信息的由来
本文主要介绍了 Linux 内核稳定性问题中的“kernel panic”现象,并深入分析了其产生的原因、异常处理流程以及如何处理。文章以一个具体的异常案例为切入点,详细解释了异常信息的解读、异常向量表的查找、异常处理函数的执行过程,并最终揭示了 panic 报错信息的来源。文章还介绍了 oops_enter、console_verbose、__die、dump_backtrace 等关键函数的功能,以及 panic_on_oops 内核参数对 panic 流程的影响。通过本文的学习,读者可以更好地理解内核 panic 的产生机制,并掌握相应的调试方法。