![[Android稳定性] 第005篇 [问题篇] 原子状态调度引起死机](https://hexoimg.oss-cn-shanghai.aliyuncs.com/blog/24/12/cover_android_stability_005.png)
[Android稳定性] 第005篇 [问题篇] 原子状态调度引起死机
本文讨论了在多核系统中因锁使用不当导致的死机异常问题。作者通过两个案例说明了当在原子状态下执行调度命令时会出现BUG,并分析了原因,指出使用全局变量来控制加解锁操作是多此一举且易出错的。文章强调应正确使用锁来保护临界区,避免使用全局变量来控制锁状态,以防止并发执行时的问题。
![[Android稳定性] 第004篇 [原理篇] minidump的原理介绍](https://hexoimg.oss-cn-shanghai.aliyuncs.com/blog/24/12/cover_android_stability_004.png)
[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的原理介绍](https://hexoimg.oss-cn-shanghai.aliyuncs.com/blog/24/12/cover_android_stability_002.png)
[Android稳定性] 第002篇 [原理篇] subsystem ramdump的原理介绍
本文介绍了SSR(子系统重启)功能,它是高通的一项特性,允许在子系统崩溃时重启该子系统而不影响整个系统。文章还详细说明了如何启用SSR、抓取子系统RAM dump日志,并介绍了小米对这一功能的改造,即将日志分类整理。此外,文章提供了制造子系统崩溃的指令方法和测试用例,以及如何查看生成的RAM dump日志。
![[Android稳定性] 第001篇 [方法篇] 高通Android平台稳定性分析介绍](https://hexoimg.oss-cn-shanghai.aliyuncs.com/blog/24/12/image_b05b186a515e6f82e9535c6b41fd201e.png)
[Android稳定性] 第001篇 [方法篇] 高通Android平台稳定性分析介绍
本文主要介绍了Linux kernel crash分析的基础知识点,包括高通pmic的几种复位类型、解析dump的工具、Linux ramdump parser的使用、TRACE32工具的应用,以及系统异常的分类及原因。作者详细阐述了每种复位类型的特点和适用场景,列举了多种解析dump的工具及其输出,并通过图表和图片展示了Linux ramdump parser和TRACE32的使用方法。同时,文章还简要介绍了系统异常的分类及原因,为研发人员提供了解决底层稳定性问题的参考。
![[Android稳定性] 第000篇 Android稳定性系列开篇](https://halo-19274848.oss-cn-shanghai.aliyuncs.com/2025/06/halo_agdmerq.jpg?x-oss-process=image/resize,w_800,m_lfit)
[Android稳定性] 第000篇 Android稳定性系列开篇
本文集深入探讨了Android稳定性问题,分为方法篇、原理篇和问题篇三个部分。方法篇介绍了稳定性分析的方法,包括高通Android平台稳定性分析、watchdog分析流程、crash分析以及RCU Stall问题的分析等。原理篇详细解析了subsystem ramdump、mtdoops、minidump、blackbox等稳定性相关原理,以及高通平台watchdog机制和QCOM常见reboot类型流程。问题篇则列举了多种稳定性问题案例,如原子状态调度引起的死机、中断风暴导致的panic、内存分配失败、slab内存泄露等,并分析了其原因及解决方案。

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

如何实现动态切换rro?
在Android项目中,针对单一设备名需适配两套电池参数的问题,提出一种通过vnd侧overlay apk和系统属性切换的解决方案。首先,编译两套独立的overlay apk,每套包含不同的`power_profile.xml`文件。然后,利用系统属性`ro.power.profile`作为触发条件,在rc文件中根据设备特性设置该属性,从而动态切换overlay。此方案避免了修改missi侧代码,确保了项目的灵活性和稳定性。
![[linux内存管理] 第011篇 内存模型之Sparse Memory Model](https://hexoimg.oss-cn-shanghai.aliyuncs.com/blog/24/12/cover_linux_memory_management_011.png)
[linux内存管理] 第011篇 内存模型之Sparse Memory Model
**本文对 Linux 内核中 SPARSEMEM 内存模型的初始化过程进行了深入剖析**。 **1. `bootmem_init()` 函数** * 调用 `memblocks_present()` 对 `SPARSEMEM` 模型的关键变量 `mem_section` 进行内存分配和初始化。 * 调用 `sparse_init()` 进一步对 `SPARSEMEM` 进行初始化,包括对其管理的每个 `page` 进行映射。 * 调用 `zone_sizes_init()` 初始化 `zone` 数据结构。 * 调用 `memblock_dump_all()` 在 `memblock_debug` 使能的情况下,`dump` 当前 `memblock` 分布。 **2. `memblocks_present()` 函数** * 遍历 `memblock.memory` 中所有的内存块,获取起始地址、结束地址和节点编号。 * 对每个内存块,调用 `memory_present()` 函数进行初始化。 **3. `memory_present()` 函数** * 创建 `mem_section` 结构体,并标记为 `present` 状态。 * 将内存块划分成多个 `section`,每个 `section` 对应一个 `mem_section` 结构体。 * 为每个 `section` 分配 `struct page` 描述符数组。 **4. `sparse_init()` 函数** * 调用 `memblocks_present()` 初始化 `mem_section` 结构体。 * 遍历所有存在的 `mem_section`,并调用 `sparse_init_nid()` 函数进行初始化。 **5. `sparse_init_nid()` 函数** * 为每个节点分配 `mem_section_usage` 结构体,用于存储每个 `section` 的使用情况。 * 为每个 `section` 分配 `struct page` 描述符数组。 * 初始化 `mem_section` 结构体,并设置其 `section_mem_map` 和 `mem_map` 成员变量。 **总结** 通过以上分析,我们可以看到 SPARSEMEM 内存模型的初始化过程相对复杂,涉及到多个数据结构和函数。但是,只要我们理解了其核心思想,就能够更好地理解 Linux 内核的内存管理机制。 **此外,本文还简要介绍了 SPARSEMEM 模型中的一些关键数据结构,例如 `struct mem_section` 和 `struct page`,以及它们之间的关系**。 **希望本文能够帮助您更好地理解 Linux 内核中的 SPARSEMEM 内存模型**。
![[linux内存管理] 第012章 物理内存管理三大结构体之zone](https://hexoimg.oss-cn-shanghai.aliyuncs.com/blog/24/12/image_01a394592c615a3e79014ebf60d0709c.png)
[linux内存管理] 第012章 物理内存管理三大结构体之zone
本文探讨了Linux内存管理中的内存域(Zone)概念。内存域是内核内存管理机制的重要组成部分,它根据内存区域的特点对物理内存进行划分,以满足不同类型的内存分配需求。本文详细介绍了Zone的类型、数据结构以及其在内存管理中的作用,并解释了Zone的统计信息、冷热页与Per-CPU上的页面高速缓存等相关概念。最后,通过关系结构图和架构层次图,直观展示了Zone与其他内存管理结构之间的关系。

记一次uid设置错误导致的adb push失败问题
我司项目无法通过ADB将文件推送至`/vendor/firmware_mnt`目录。分析显示,该目录仅授权给`group`为`system`的读写权限,而`root`用户无权限访问。解决方案为修改`/vendor/etc/fstab.default`文件,将`uid=0`改为`uid=1000`,重新挂载后可成功推送文件。验证结果显示,修改后文件推送正常。

设备树节点是如何转换成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详解](https://hexoimg.oss-cn-shanghai.aliyuncs.com/blog/24/12/cover_linux_memory_management_010.png)
[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 内核的内存管理机制,并为后续的内存管理学习和开发打下坚实的基础**。