[linux内存管理] 第014篇 /proc/zoneinfo的详细解析 2024-12-30 评论
[linux内存管理] 第014篇 /proc/zoneinfo的详细解析

深入剖析了Linux内核内存管理中/proc/zoneinfo虚拟文件的实现原理及信息结构,聚焦zoneinfo_show与zoneinfo_show_print两个核心函数,详细解析其如何遍历各个内存节点和zone,并输出包括节点内存统计、zone页面分布、水位线、页面状态等关键数据。文章针对每项输出参数进行了明晰解释,帮助理解匿名页面、文件缓存、slab等在内存管理中的角色及其状态变化。通过精细揭示/proc/zoneinfo信息来源、内容组织和内核统计逻辑,为开发者和运维人员提供了获取和解读Linux物理内存实时状态的系统级参考,对性能优化及故障排查具有实用价值。

[Android稳定性] 第013篇 [问题篇] page allocation failure: order:0内存分配失败的异常报错 2024-12-26 评论
[Android稳定性] 第013篇 [问题篇] page allocation failure: order:0内存分配失败的异常报错

在工厂老化测试过程中,设备出现卡视频现象,但USB接口可以识别到ADB口。通过分析日志发现,设备频繁出现"page allocation failure"错误,且均为"order:0",表明在分配一页大小的内存时失败。然而,系统配置中存在空闲的4KB内存,且内存分配标志为"GFP_NOWAIT|__GFP_NORETRY",表示希望进行一个非阻塞的内存分配,而空闲的UMEH页面恰好符合这些条件。这表明内核在内存充足的情况下无法分配内存,原因可能在于erofs文件系统在执行解压缩时使用GFP_NOWAIT标签进行内存申请,减少分配page的压力,但可能存在系统内存水位线不满足要求的情况。

[Android稳定性] 第012篇 [原理篇] blackbox的原理介绍 2024-12-26 7 条
[Android稳定性] 第012篇 [原理篇] blackbox的原理介绍

Blackbox 是一种日志管理方案,旨在解决当前日志分析和自动化解析的痛点,如日志分散、时间标准不统一、关键事件记录丢失、RAS 实现自动化分析困难等。Blackbox 将大部分系统日志集中在特定分区,具有时间线的流式日志,可读性更强。它还根据已有经验在系统运行的关键节点打点,提升上市后稳定性问题的定位效率。针对不同的日志,有不同的日志老化删除节奏,从而更多保存异常日志。Blackbox 还提高了 RAS 自动化分析的能力,并可在设备卡死时通过 9008 方式将日志分区 dump 出来并解析,辅助问题分析。

[Android稳定性] 第011篇 [原理篇] minidump的原理介绍补充 2024-12-25 评论
[Android稳定性] 第011篇 [原理篇] minidump的原理介绍补充

这篇文章主要介绍了Android系统中的minidump机制,这是一种用于保存系统崩溃信息的技术。文章首先解释了minidump的概念,即各个子系统在内存映射表中注册,当系统崩溃时,boot subsystem会加密并保存注册过的内存信息到RAM EMMC分区。 接着,文章详细描述了minidump的流程图和代码流程,包括HLOS侧和NON-HLOS侧的流程。在HLOS侧,文章重点介绍了defconfig配置、相关代码以及msm_minidump_add_region函数。在NON-HLOS侧,文章重点介绍了add_minidump_regions函数和boot_ram_dump_to_raw_parition函数。 文章还介绍了小米项目在minidump中增加的regions,包括md_kmsg、md_pmsg和tz_log,并解释了它们的设计原理。最后,文章介绍了如何验证minidump,包括设置minidump到emmc、触发dump以及从设备中拉取minidump。 此外,文章还介绍了minidump.gz的解析方法,包括解压minidump.gz和拆分minidump。

[linux内存管理] 第013篇 zone的初始化 2024-12-21 评论
[linux内存管理] 第013篇 zone的初始化

深入剖析Linux内核在物理内存初始化阶段对zone区域的配置过程,围绕zone_sizes_init和free_area_init两个关键函数,系统展示内存分区边界的确立与结构初始化流程。通过追踪start_kernel的调用链,详细讲解zone_sizes_init如何依据DRAM最小与最大页帧号、系统体系结构特性动态计算ZONE_DMA、ZONE_DMA32、ZONE_NORMAL等区域的PFN界限,并最终通过free_area_init设置各zone边界,同时针对NUMA架构完成节点内存的分区与struct page的初始化。

[Android稳定性] 第009篇 [问题篇] 数组越界导致的内核panic 2024-12-19 评论
[Android稳定性] 第009篇 [问题篇] 数组越界导致的内核panic

**问题现象**: 部分机器插着 USB 后出现死机。 **问题分析**: 通过 `dmesg` 和 `trace32` 分析,发现死机原因是 `power_operation_mode_show` 函数中 `typec_port` 结构体的 `pwr_opmode` 成员值错误(为负数),导致数组越界。 **解决方案**: 更新 charger 模块,修复对 `pwr_opmode` 的误判,确保其值为正数,避免数组越界。 **总结**: 本次问题是由 `typec_port` 结构体的 `pwr_opmode` 成员值错误导致,通过分析定位问题,并更新 charger 模块修复了问题。

[Android稳定性] 第008篇 [原理篇] 动态设置kernel cmdline 2024-12-19 评论
[Android稳定性] 第008篇 [原理篇] 动态设置kernel cmdline

本文介绍了一种在fastboot模式下动态修改内核参数的方法,无需重新打包。首先,通过扩展fastboot oem指令,接收输入的内核参数并写入到devinfo分区中。然后,在更新kernel cmdline时,将保存的内核参数添加到cmdline中。实验测试显示,该方案可以成功修改内核参数,并永久生效。代码更新后,支持设置、追加和清除模式,方便用户根据需求进行操作。

[Android稳定性] 第006篇 [问题篇] hungtask causing panic-死锁 2024-12-18 评论
[Android稳定性] 第006篇 [问题篇] hungtask causing panic-死锁

本文讨论了一个系统问题现象,通过分析日志文件发现一个进程因等待锁而被阻塞120秒。通过使用`tace32`工具跟踪调用栈,发现存在一个三方的死锁情况,涉及进程`2848_9`、`crtc_commit:160`、`vendor.qti.came`和`kworker/u16:7`。文章详细展示了锁的持有者和调用栈信息,但未提供具体的解决方法。

[Android稳定性] 第003篇 [原理篇] mtdoops的原理介绍 2024-12-18 评论
[Android稳定性] 第003篇 [原理篇] mtdoops的原理介绍

**mtdoops简介与原理总结** mtdoops是一种将系统崩溃时的日志信息保存到MTD(Memory Technology Device)设备中的机制,用于在系统panic时捕获关键信息。它利用MTD子系统,将崩溃日志转存到非易失存储器中,便于后续问题分析。mtdoops与其他捕获panic的方式(如ramoops和kdump)相比,具有特定优势,但需依赖MTD设备和相关配置。 **核心内容摘要:** - mtdoops通过在内核中注册捕获panic或oops,将日志信息保存到MTD设备。 - 需要在内核defconfig中启用相关配置,并在设备树中预留存储空间。 - 通过cmdline动态更新,确保在系统启动时正确配置mtdoops。 - 功能验证包括开机初始化log检查、cmdline确认及重启测试抓取log。 - offline_log机制可触发mtdoops日志抓取,便于问题诊断。