2024-12-18
[Android稳定性] 第005篇 [问题篇] 原子状态调度引起死机
本文讨论了在多核系统中因锁使用不当导致的死机异常问题。作者通过两个案例说明了当在原子状态下执行调度命令时会出现BUG,并分析了原因,指出使用全局变量来控制加解锁操作是多此一举且易出错的。文章强调应正确使用锁来保护临界区,避免使用全局变量来控制锁状态,以防止并发执行时的问题。
2024-12-18
[Android稳定性] 第004篇 [原理篇] minidump的原理介绍
Minidump是一种在系统崩溃时,将关键内存区域加密后保存至RAM或EMMC分区的机制,以便后续调试分析。文章详细解析了minidump的流程:系统各子模块会在内存映射表注册,崩溃时boot子系统通过检测特定寄存器(如TCSR寄存器)判断是否进入minidump流程,随后将内核日志、logcat及安全区域日志等关键区块存入特定分区。文中通过流程图、代码示例和寄存器地址详解,剖析了从检测寄存器值,到执行XBLRamDumpMain写入dump的完整过程,并指出通过简单配置可实现最小化、定制化的日志保存,极大提升了问题定位的效率。此外,文章特别强调小米定制适配方案,仅保留关键日志区,兼顾调试需求
2024-12-18
[Android稳定性] 第002篇 [原理篇] subsystem ramdump的原理介绍
本文介绍了SSR(子系统重启)功能,它是高通的一项特性,允许在子系统崩溃时重启该子系统而不影响整个系统。文章还详细说明了如何启用SSR、抓取子系统RAM dump日志,并介绍了小米对这一功能的改造,即将日志分类整理。此外,文章提供了制造子系统崩溃的指令方法和测试用例,以及如何查看生成的RAM dump日志。
2024-12-15
[Android稳定性] 第001篇 [方法篇] 高通Android平台稳定性分析介绍
本文主要介绍了Linux kernel crash分析的基础知识点,包括高通pmic的几种复位类型、解析dump的工具、Linux ramdump parser的使用、TRACE32工具的应用,以及系统异常的分类及原因。作者详细阐述了每种复位类型的特点和适用场景,列举了多种解析dump的工具及其输出,并通过图表和图片展示了Linux ramdump parser和TRACE32的使用方法。同时,文章还简要介绍了系统异常的分类及原因,为研发人员提供了解决底层稳定性问题的参考。
2024-12-15
[Android稳定性] 第000篇 Android稳定性系列开篇
本文集深入探讨了Android稳定性问题,分为方法篇、原理篇和问题篇三个部分。方法篇介绍了稳定性分析的方法,包括高通Android平台稳定性分析、watchdog分析流程、crash分析以及RCU Stall问题的分析等。原理篇详细解析了subsystem ramdump、mtdoops、minidump、blackbox等稳定性相关原理,以及高通平台watchdog机制和QCOM常见reboot类型流程。问题篇则列举了多种稳定性问题案例,如原子状态调度引起的死机、中断风暴导致的panic、内存分配失败、slab内存泄露等,并分析了其原因及解决方案。
2024-12-14
如何排查rro资源overlay的问题?
本文介绍了运行时资源叠加层(RRO)的概念、工作原理以及如何构建、解析和配置叠加层。RRO 允许在运行时更改目标软件包的资源值,从而实现更灵活的资源定制。文章详细解释了叠加资源的设置清单、资源映射、构建软件包、解析资源以及启用/停用叠加层的操作。此外,文章还介绍了如何限制可叠加资源、配置叠加层以及排查 RRO 问题。最后,通过一个实例展示了如何在 vendor 侧集成 power_profile.xml 的 overlay。
2024-12-14
如何实现动态切换rro?
在Android项目中,针对单一设备名需适配两套电池参数的问题,提出一种通过vnd侧overlay apk和系统属性切换的解决方案。首先,编译两套独立的overlay apk,每套包含不同的`power_profile.xml`文件。然后,利用系统属性`ro.power.profile`作为触发条件,在rc文件中根据设备特性设置该属性,从而动态切换overlay。此方案避免了修改missi侧代码,确保了项目的灵活性和稳定性。
2024-12-12
[linux内存管理] 第011篇 内存模型之Sparse Memory Model
深入解析Linux内核SPARSEMEM稀疏内存模型的初始化流程,重点剖析bootmem_init及其核心环节,包括mem_section数据结构分配、内存块映射与标记,并结合代码详细说明多NUMA节点和物理内存管理策略。
2024-12-12
[linux内存管理] 第012章 物理内存管理三大结构体之zone
本文探讨了Linux内存管理中的内存域(Zone)概念。内存域是内核内存管理机制的重要组成部分,它根据内存区域的特点对物理内存进行划分,以满足不同类型的内存分配需求。本文详细介绍了Zone的类型、数据结构以及其在内存管理中的作用,并解释了Zone的统计信息、冷热页与Per-CPU上的页面高速缓存等相关概念。最后,通过关系结构图和架构层次图,直观展示了Zone与其他内存管理结构之间的关系。
2024-12-06
记一次uid设置错误导致的adb push失败问题
我司项目无法通过ADB将文件推送至`/vendor/firmware_mnt`目录。分析显示,该目录仅授权给`group`为`system`的读写权限,而`root`用户无权限访问。解决方案为修改`/vendor/etc/fstab.default`文件,将`uid=0`改为`uid=1000`,重新挂载后可成功推送文件。验证结果显示,修改后文件推送正常。
2024-12-05
设备树节点是如何转换成platform_device设备的呢?
本文详细介绍了Linux内核中设备树dtb文件转换为platform_device的过程。首先,设备树中的各个节点会转换为device_node结构,然后通过of_platform_populate函数遍历这些节点,并根据节点的compatible属性创建对应的platform_device。对于包含特定compatible属性的节点,其子节点也会被转换为platform_device。此外,设备树中的reg和interrupt属性会被转换为platform_device中的resource结构,而其他属性则通过device_node结构传递给驱动开发者。
2024-12-03
[linux 内存管理] 第010篇 paging_init详解
深入解析Linux内核启动过程中内存管理的关键环节——paging_init的实现与流程。从内核镜像与DTB映射完成、物理内存信息收集,到最终通过paging_init建立全局页表,实现物理内存与虚拟地址的完整线性映射。不仅详细拆解了pgd_set_fixmap与map_kernel等核心函数如何操作页表,确保各段内存安全可访问,还揭示了FIXMAP临时映射区的机制及内核空间各段映射权限的处理逻辑。整个过程展现内存状态由“黑暗”到“可控”转变,让内核具备正式使用和管理所有物理内存的能力。通过示意图与源码分析,读者能够系统理解内存初始化背后的技术细节与实际意义,为深入掌握Linux内存管理体系奠定基础。