[Android稳定性] 第005篇 [问题篇] 原子状态调度引起死机 2024-12-18 评论
[Android稳定性] 第005篇 [问题篇] 原子状态调度引起死机

本文讨论了在多核系统中因锁使用不当导致的死机异常问题。作者通过两个案例说明了当在原子状态下执行调度命令时会出现BUG,并分析了原因,指出使用全局变量来控制加解锁操作是多此一举且易出错的。文章强调应正确使用锁来保护临界区,避免使用全局变量来控制锁状态,以防止并发执行时的问题。

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

**minidump** 是一种用于保存系统崩溃信息的机制。当系统发生崩溃时,boot subsystem 会加密并保存注册过的 memory 信息到 RAM EMMC 分区。 **流程**: 1. 开机时,内存中会为 minidump 保留一部分空间,用于存储 kernel log、logcat 和 tz_log。 2. 如果手机触发 dump,在第二次开机时,boot subsystem 会读取 TCSR 寄存器中的 minidump 模式标志。 3. 如果启用 minidump,boot subsystem 会读取 kmsg 和 logcat log,并将其写入 minidump 分区。 4. 开机后,可以使用 dd 指令导出 minidump 分区,并使用 ultraedit 查看 log。 **验证方法**: 1. 将 minidump 设置为 emmc 模式。 2. 触发 dump。 3. 导出 minidump 分区并查看 log。 **总结**: minidump 是一种有效的系统崩溃信息保存机制,可以帮助开发者快速定位问题。

[Android稳定性] 第002篇 [原理篇] subsystem ramdump的原理介绍 2024-12-18 评论
[Android稳定性] 第002篇 [原理篇] subsystem ramdump的原理介绍

本文介绍了SSR(子系统重启)功能,它是高通的一项特性,允许在子系统崩溃时重启该子系统而不影响整个系统。文章还详细说明了如何启用SSR、抓取子系统RAM dump日志,并介绍了小米对这一功能的改造,即将日志分类整理。此外,文章提供了制造子系统崩溃的指令方法和测试用例,以及如何查看生成的RAM dump日志。

[Android稳定性] 第001篇 [方法篇] 高通Android平台稳定性分析介绍 2024-12-15 评论
[Android稳定性] 第001篇 [方法篇] 高通Android平台稳定性分析介绍

本文主要介绍了Linux kernel crash分析的基础知识点,包括高通pmic的几种复位类型、解析dump的工具、Linux ramdump parser的使用、TRACE32工具的应用,以及系统异常的分类及原因。作者详细阐述了每种复位类型的特点和适用场景,列举了多种解析dump的工具及其输出,并通过图表和图片展示了Linux ramdump parser和TRACE32的使用方法。同时,文章还简要介绍了系统异常的分类及原因,为研发人员提供了解决底层稳定性问题的参考。

[Android稳定性] 第000篇 Android稳定性系列开篇 2024-12-15 1 条
[Android稳定性] 第000篇 Android稳定性系列开篇

本文集深入探讨了Android稳定性问题,分为方法篇、原理篇和问题篇三个部分。方法篇介绍了稳定性分析的方法,包括高通Android平台稳定性分析、watchdog分析流程、crash分析以及RCU Stall问题的分析等。原理篇详细解析了subsystem ramdump、mtdoops、minidump、blackbox等稳定性相关原理,以及高通平台watchdog机制和QCOM常见reboot类型流程。问题篇则列举了多种稳定性问题案例,如原子状态调度引起的死机、中断风暴导致的panic、内存分配失败、slab内存泄露等,并分析了其原因及解决方案。

如何排查rro资源overlay的问题? 2024-12-14 评论
如何排查rro资源overlay的问题?

本文介绍了运行时资源叠加层(RRO)的概念、工作原理以及如何构建、解析和配置叠加层。RRO 允许在运行时更改目标软件包的资源值,从而实现更灵活的资源定制。文章详细解释了叠加资源的设置清单、资源映射、构建软件包、解析资源以及启用/停用叠加层的操作。此外,文章还介绍了如何限制可叠加资源、配置叠加层以及排查 RRO 问题。最后,通过一个实例展示了如何在 vendor 侧集成 power_profile.xml 的 overlay。

如何实现动态切换rro? 2024-12-14 评论
如何实现动态切换rro?

在Android项目中,针对单一设备名需适配两套电池参数的问题,提出一种通过vnd侧overlay apk和系统属性切换的解决方案。首先,编译两套独立的overlay apk,每套包含不同的`power_profile.xml`文件。然后,利用系统属性`ro.power.profile`作为触发条件,在rc文件中根据设备特性设置该属性,从而动态切换overlay。此方案避免了修改missi侧代码,确保了项目的灵活性和稳定性。

[linux内存管理] 第012章 物理内存管理三大结构体之zone 2024-12-12 评论
[linux内存管理] 第012章 物理内存管理三大结构体之zone

本文探讨了Linux内存管理中的内存域(Zone)概念。内存域是内核内存管理机制的重要组成部分,它根据内存区域的特点对物理内存进行划分,以满足不同类型的内存分配需求。本文详细介绍了Zone的类型、数据结构以及其在内存管理中的作用,并解释了Zone的统计信息、冷热页与Per-CPU上的页面高速缓存等相关概念。最后,通过关系结构图和架构层次图,直观展示了Zone与其他内存管理结构之间的关系。

设备树节点是如何转换成platform_device设备的呢? 2024-12-05 评论
设备树节点是如何转换成platform_device设备的呢?

你好,我理解你的需求,以下是我为你写的100字左右的摘要: 本文详细介绍了Linux内核中设备树dtb文件转换为platform_device的过程。首先,设备树中的各个节点会转换为device_node结构,然后通过of_platform_populate函数遍历这些节点,并根据节点的compatible属性创建对应的platform_device。对于包含特定compatible属性的节点,其子节点也会被转换为platform_device。此外,设备树中的reg和interrupt属性会被转换为platform_device中的resource结构,而其他属性则通过device_node结构传递给驱动开发者。

[linux 内存管理] 第010篇 paging_init详解 2024-12-03 评论
[linux 内存管理] 第010篇 paging_init详解

**本篇文章介绍了 Linux 内核启动过程中 `paging_init` 函数的作用和实现细节**。 * **作用**: 建立物理内存到内核空间虚拟地址的映射,使得操作系统可以正常访问和管理内存。 * **实现**: * **fixmap 映射**: 将内核页表 `swapper_pg_dir` 映射到 fixmap 区域,方便后续操作。 * **内核段映射**: 将内核映像的各个段(text, rodata, inittext, initdata, data)映射到内核空间的虚拟地址(vmalloc 区域)。 * **物理内存映射**: 将 `memblock.memory` 中所有 regions 对应的物理内存进行线性映射,使得整个物理内存区域可以被访问。 * **页表替换**: 将 fixmap 映射的页表替换为 `swapper_pg_dir` 页表,并更新内核主进程的 pgd 地址。 * **内存释放**: 释放 `init_pg_dir` 页表的物理内存,并允许 memblock 重新调整大小。 * **关键函数**: * `pgd_set_fixmap`: 将 pgd 页表映射到 fixmap 区域。 * `map_kernel`: 映射内核段的动态页表。 * `map_mem`: 建立物理内存的线性映射。 * `__create_pgd_mapping`: 依次动态建立各级页表。 * `alloc_init_pud`: 填充 pgd 表项,并建立 pud 页表。 * `alloc_init_cont_pmd`: 填充 pmd 表项,并建立 pte 页表。 * `early_pgtable_alloc`: 动态分配页表。 * **总结**: `paging_init` 函数是 Linux 内核启动过程中至关重要的步骤,它为操作系统提供了访问和管理内存的能力,为后续的内存管理操作奠定了基础。 **通过理解 `paging_init` 函数的实现细节,可以更好地理解 Linux 内核的内存管理机制,并为后续的内存管理学习和开发打下坚实的基础**。