10月前
评论
[Android稳定性] 第022篇 [原理篇] kernel panic的死亡信息的由来
本文主要介绍了 Linux 内核稳定性问题中的“kernel panic”现象,并深入分析了其产生的原因、异常处理流程以及如何处理。文章以一个具体的异常案例为切入点,详细解释了异常信息的解读、异常向量表的查找、异常处理函数的执行过程,并最终揭示了 panic 报错信息的来源。文章还介绍了 oops_enter、console_verbose、__die、dump_backtrace 等关键函数的功能,以及 panic_on_oops 内核参数对 panic 流程的影响。通过本文的学习,读者可以更好地理解内核 panic 的产生机制,并掌握相应的调试方法。
10月前
评论
[Android稳定性] 第021篇 [问题篇] Kernel panic - not syncing: stack-protector: Kernel stack is corrupted
### 文章摘要 本文探讨了在Android系统中出现的一个内核崩溃问题,具体表现为`Kernel panic`错误,并深入分析了崩溃的原因。通过对内核日志和进程栈的解析,发现崩溃发生在`mi_binder_wait4_hook`函数中,由于栈帧指针`x29`发生`bitflip`错误,导致从错误的地址读取值,触发`__stack_chk_fail`函数,最终导致内核崩溃。文章详细介绍了如何通过分析汇编代码和进程栈来定位问题,并提出了可能的解决方案,即添加`nop`指令来防止`bitflip`问题。
10月前
评论
[Android稳定性] 第020篇 [方法篇] crash实战:手把手教你使用crash分析内核dump
本文介绍了使用crash工具分析Linux内核崩溃(Kdump)的方法,重点针对手机领域。crash工具在处理大型dump文件时比trace32更加高效,因为它不会占用大量内存资源。文章还探讨了crash工具在恢复任务调用栈、查看局部变量值等方面的实用技巧,以及如何查找访问特定变量的线程。通过crash工具,开发者可以更有效地定位和解决内核崩溃问题,提高问题定位的效率。
11月前
评论
[Android稳定性] 第019篇 [原理篇] QCOM 常见 reboot 类型流程梳理
本文详细梳理了Android设备的三种重启类型:ADB重启、电源键重启(包括长按电源键直接重启和弹窗重启)以及panic重启。通过分析源代码,揭示了每种重启类型的流程,包括重启动作、事件处理、服务关闭、文件系统同步、内存清理等步骤。文章还探讨了重启前系统属性的处理流程,以及重启后如何从寄存器中获取重启原因,并传递给ABL阶段。最后,文章以高通项目为例,说明了重启流程中内核通知链的作用,以及重启后如何根据重启原因启动不同的系统模式。
11月前
评论
[Android稳定性] 第018篇 [问题篇] 串口日志未关闭导致的watchdog
系统出现死机,日志显示QCOM Apps Watchdog超时触发。分析发现,所有CPU核心均暂停等待`rcu_momentary_dyntick_idle`,CPU0正在执行打印操作,导致无法及时pet watchdog,引发异常。解决方案建议关闭kernel的串口日志以避免类似问题。
11月前
评论
[Android稳定性] 第017篇 [方法篇] 高通watchdog分析流程
高通watchdog分析七步法:首先检查执行状态,确认进程位置和状态;若未就绪,探究timer问题;若就绪未调度,分析中断及调度状况;最后检查进程是否禁止抢占,确保系统稳定运行。
11月前
评论
[Android稳定性] 第016篇 [原理篇] 高通平台watchdog机制原理解析
Watchdog是一种用于嵌入式系统的机制,当系统出现严重故障时,可以在无人为介入的情况下自动重新启动系统。它分为硬件和软件两种类型,硬件watchdog比软件watchdog有更好的可靠性。在高通平台Android系统中,watchdog的实现有所不同,本文主要介绍了高通平台Android系统中watchdog的种类、实现、初始化入口、通知链和主线程。
11月前
评论
[linux内存管理] 第019篇 buddy分配器基础知识以及分配器api接口
本文主要介绍了Linux内存管理中的伙伴系统,它是Linux内核中基本的内存分配系统,涉及页面分配、页面回收、页面规整等机制。文章详细剖析了快速分配之前的一些基础知识,包括分配掩码、分配标志、分配的API接口以及Linux对于伙伴系统的设计思路。伙伴系统将空闲页面分成11个块链表,每个块链表管理着2的幂次方个连续页面,内存管理框图展示了其组织结构。同时,文章还解释了内存块是如何连接的,以及伙伴系统的合并机制。
11月前
评论
[linux内存管理] 第018篇 buddy系统的简介以及初始化
本文深入剖析了Linux内存管理中伙伴系统的初始化流程。伙伴系统是Linux内核用于管理和分配物理内存页面的核心算法,它将内存分成大小为2的幂次方的内存块,并通过“伙伴”机制进行分配和回收。文章详细介绍了伙伴系统的数据结构,包括`struct free_area`和`struct zone`,以及迁移类型`migratetype`和区域请求标志`__GFP区域请求标志`。此外,文章还分析了fallbacks机制和`pageblock_order`的定义。最后,文章通过分析`mm_init`函数和`memblock_free_all`函数,揭示了伙伴系统初始化的详细过程,包括释放未使用的内存、重置zone的`managed_pages`、将内存块添加到伙伴系统等操作。通过本文的解析,读者可以更好地理解Linux内存管理中伙伴系统的工作原理和初始化过程。
11月前
评论
[linux内存管理] 第017篇 zonelist的初始化
本文主要分析了Linux内核中zonelist的初始化过程。首先介绍了两个关键数据结构:`pglist_data`和`zonelist`,其中`pglist_data`包含了一个`node_zonelists`数组,用于管理内存节点的zone信息;`zonelist`结构体则包含了一个`zoneref`数组,用于描述一个node的各个zone的信息。接着详细阐述了zonelist的初始化过程,包括`build_all_zonelists`、`build_zonelists`和`build_zonerefs_node`三个关键函数。最后,总结了zonelist的初始化过程,并附上了初始化过程的示意图。
11月前
评论
[linux内存管理] 第016篇 /proc/iomem的详细解析
本文详细介绍了Linux内核中`/proc/iomem`节点的构建与显示过程。文章首先指出`/proc/iomem`展示的是物理内存的使用情况,并通过`request_standard_resources`函数将内存区域挂载到资源树。文章进一步解析了`/proc/iomem`的注册过程,包括`ioresources_init`函数和`iomem_resource`资源树,以及数据来源和显示逻辑。最后总结,`/proc/iomem`通过遍历资源树和格式化输出,提供了系统物理内存布局的详细视图,对资源管理和调试具有重要作用。
11月前
评论
[linux内存管理] 第015篇 理解Linux内核中的memblock和ioremap机制
Linux内核中,设备寄存器的物理地址管理涉及`memblock`和`ioremap`两个关键机制。`memblock`在内核启动阶段负责物理内存的分布记录和地址保留,确保设备寄存器不被误用。`ioremap`则将物理地址映射到内核虚拟地址空间,便于驱动程序访问寄存器。设备寄存器映射流程包括设备描述、物理地址保留、驱动加载和地址映射,最终驱动通过虚拟地址访问寄存器。这两者共同确保了设备寄存器的正确管理和高效访问。