[linux内存管理] 第022篇 buddy内存管理之慢速分配 2025-02-19 评论
[linux内存管理] 第022篇 buddy内存管理之慢速分配

延续对内核内存分配机制的深入解析,本文聚焦于`__alloc_pages`函数中的慢速分配流程。当快速分配失败后,系统会启用慢速路径,通过多种方式尝试获得所需页,包括直接回收、内存规整、唤醒kswapd线程与触发OOM机制。详细剖析了关键参数如`can_direct_reclaim`(是否允许回收)、`costly_order`(大块分配压力)、`__GFP_ATOMIC`滥用检查,以及规整与回收触发条件。代码层面揭示内存分配失败时的处理逻辑,强调高效而严谨的回退与重试机制,保证系统最大程度完成分配需求,并在极端情况下输出详细警告。

[Android稳定性] 第024篇 [方法篇] RCU Stall问题如何进行分析? 2025-02-18 评论
[Android稳定性] 第024篇 [方法篇] RCU Stall问题如何进行分析?

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

[linux内存管理] 第020篇 Linux内核slab内存的越界检查SLUB_DEBUG的原理剖析 2025-02-11 评论
[linux内存管理] 第020篇 Linux内核slab内存的越界检查SLUB_DEBUG的原理剖析

越界访问常引发难以定位的系统异常,尤其在驱动开发中隐蔽性极高。SLUB DEBUG通过在分配内存对象周围设置特殊区域和magic数,有效检测越界(OOB)、用后即弃(UAF)等问题。借助Red zone和padding机制,能精准发现内存溢出及链表破坏,搭配slabinfo工具主动触发检测。

[Android稳定性] 第023篇 [问题篇] printk非空的非法指针参数导致的spinlock死锁引起Non Secure WDT 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`的参数为非法指针时,会导致死锁。

[Android稳定性] 第022篇 [原理篇] kernel panic的死亡信息的由来 2025-01-20 评论
[Android稳定性] 第022篇 [原理篇] kernel panic的死亡信息的由来

本文主要介绍了 Linux 内核稳定性问题中的“kernel panic”现象,并深入分析了其产生的原因、异常处理流程以及如何处理。文章以一个具体的异常案例为切入点,详细解释了异常信息的解读、异常向量表的查找、异常处理函数的执行过程,并最终揭示了 panic 报错信息的来源。文章还介绍了 oops_enter、console_verbose、__die、dump_backtrace 等关键函数的功能,以及 panic_on_oops 内核参数对 panic 流程的影响。通过本文的学习,读者可以更好地理解内核 panic 的产生机制,并掌握相应的调试方法。

[Android稳定性] 第021篇 [问题篇] Kernel panic - not syncing: stack-protector: Kernel stack is corrupted 2025-01-18 评论
[Android稳定性] 第021篇 [问题篇] Kernel panic - not syncing: stack-protector: Kernel stack is corrupted

深入剖析了一起由内核函数mi_binder_wait4_hook触发的“Kernel stack is corrupted”内核崩溃问题。文章通过详细的dmesg日志分析、ARM汇编栈帧解析和Trace32进程栈回溯,复现了故障发生的关键环节,定位到x29栈帧指针因bitflip问题发生异常,导致栈保护机制触发__stack_chk_fail并panic。内容不仅梳理了栈帧的典型入栈流程及关键寄存器的存储关系,还精确描述了如何通过异常PC偏移与寄存器快照还原出崩溃前后的调用链路,展示了问题定位的扎实技术细节。最后,通过二进制对比,明确指出bitflip对函数栈帧完整性的破坏方式,为类似内核异常

[Android稳定性] 第020篇 [方法篇]  crash实战:手把手教你使用crash分析内核dump 2025-01-18 评论
[Android稳定性] 第020篇 [方法篇] crash实战:手把手教你使用crash分析内核dump

本文介绍了使用crash工具分析Linux内核崩溃(Kdump)的方法,重点针对手机领域。crash工具在处理大型dump文件时比trace32更加高效,因为它不会占用大量内存资源。文章还探讨了crash工具在恢复任务调用栈、查看局部变量值等方面的实用技巧,以及如何查找访问特定变量的线程。通过crash工具,开发者可以更有效地定位和解决内核崩溃问题,提高问题定位的效率。

[Android稳定性] 第019篇 [原理篇] QCOM 常见 reboot 类型流程梳理 2025-01-15 评论
[Android稳定性] 第019篇 [原理篇] QCOM 常见 reboot 类型流程梳理

本文详细梳理了Android设备的三种重启类型:ADB重启、电源键重启(包括长按电源键直接重启和弹窗重启)以及panic重启。通过分析源代码,揭示了每种重启类型的流程,包括重启动作、事件处理、服务关闭、文件系统同步、内存清理等步骤。文章还探讨了重启前系统属性的处理流程,以及重启后如何从寄存器中获取重启原因,并传递给ABL阶段。最后,文章以高通项目为例,说明了重启流程中内核通知链的作用,以及重启后如何根据重启原因启动不同的系统模式。