[Android稳定性] 第000篇 Android稳定性系列开篇 10月前查看 1 条
[Android稳定性] 第000篇 Android稳定性系列开篇

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

[linux内存管理] 第000篇 Linux内存管理系列开篇 11月前查看 评论
[linux内存管理] 第000篇 Linux内存管理系列开篇

本文为Linux内存管理系列文章的摘要总结。文章首先介绍了源码遵循的约定,包括芯片架构、内存架构、内核版本等信息。接着概述了内存管理的一些预备知识,包括内存与内存管理机制、页表查询过程、内存分布等。文章详细分析了物理内存初始化流程,包括启动代码分析、start_kernel全局简述、fixmap映射、memblock子系统等。此外,文章还介绍了各种内存分配器(如buddy分配器、percpu分配器、CMA分配器等)和内存管理相关概念(如缺页异常处理、memcg、PSI等)。最后,列出了文章中涉及的专业术语及其解释。

[Linux进程调度] 第002篇 Linux下0号进程的前世(init_task进程)今生(idle进程) 1月前查看 评论
[Linux进程调度] 第002篇 Linux下0号进程的前世(init_task进程)今生(idle进程)

Linux下有三个特殊进程:idle(PID=0)、init(PID=1)和kthreadd(PID=2)。idle是系统首个进程,由静态定义的init_task演变而来,是唯一未通过fork/kernel_thread产生的进程,运行在内核态,每个处理器单元独立一个,负责系统空闲时执行节能循环。init由idle创建,完成初始化后进入用户空间,成为所有用户进程祖先,最终转为守护进程。kthreadd亦由idle创建,始终运行于内核空间,负责管理和调度所有内核线程,是其父进程。idle通过rest_init函数创建init和kthreadd后演变为idle,不参与调度,仅在运行队列为空时执行cpu_idle_loop。

[Android稳定性] 第058篇 [方法篇] 高通平台使用QFIL回读分区 1月前查看 7 条
[Android稳定性] 第058篇 [方法篇] 高通平台使用QFIL回读分区

本文介绍了如何将机器进入9008模式以及通过configuration选择对应的Device type类型。在edl模式下刷机,需要选择机器对应版本并拆包镜像文件。同时,文章强调了回读分区时,如果机器已熔丝签名,必须使用未签名的版本中的prog_firehose_ddr.elf文件。最后,详细展示了如何使用tools进行分区回读操作。

[linux内存管理] 第029篇 谁把folio的函数定义“藏”起来了? 2月前查看 3 条
[linux内存管理] 第029篇 谁把folio的函数定义“藏”起来了?

这篇文章探讨了在阅读Linux内核代码时,如何解决一些函数定义难以找到的问题。作者遇到了folio_test_active()等函数无法找到定义的困惑,通过搜索发现这些函数是通过特殊的宏定义在page-flags.h文件中创建的。文章详细解释了PAGE_TYPE_OPS()和FOLIO_FLAG()宏的工作原理,以及如何通过这些宏定义函数。最终,作者成功理解了这些函数的定义方式,并总结说这种方法虽然特殊,但探索和理解的过程非常有意思。

【深入内核】ARM64下的内核栈 2月前查看 评论
【深入内核】ARM64下的内核栈

本文深入探讨了Linux内核栈的运作机制。内核栈是进程生命周期中不可或缺的部分,用于保存用户态和内核态之间的上下文信息。文章解释了内核栈如何通过`task_struct`结构体与进程关联,以及`pt_regs`和`cpu_context`在任务切换和异常处理中的关键作用。此外,文章还详细说明了ARM64架构中`sp_el0`寄存器如何直接存储当前任务的`task_struct`指针,从而优化了栈指针的使用。文章最后讨论了内核栈的配置和栈回溯技术,为内核稳定性问题的分析提供了宝贵的见解。

【深入内核】内核printk原理介绍 2月前查看 评论
【深入内核】内核printk原理介绍

printk 是 Linux 内核用于输出调试信息的接口,通过 log buffer 存储日志信息,并在系统出现问题后记录错误信息。文章详细介绍了 printk 内核框架,包括 printk 接口的作用、log buffer 的设计和初始化、log buffer 的数据结构,以及 printk 函数的流程。文章还分析了 printk ring buffer 的写入过程,包括 prb_reserve、printk_sprint 和 prb_commit 等函数的核心作用。最后,文章通过 trace32 读取 printk_ringbuffer 在内存中的数据,并解释了 printk_ringbuffer 在内存中的增长方向,使读者对环形缓冲区的整体印象更加清晰。

[LRDP2] 解析插件之dmesg 2月前查看 评论
[LRDP2] 解析插件之dmesg

Linux ramdump parser工具通过解析离线ramdump文件中的内核日志来诊断系统问题。该工具的核心功能是通过DmesgLib类实现的,该类负责读取和分析内核日志。DmesgLib类首先通过读取内核内存中的printk_ringbuffer结构来定位日志数据,然后初始化环形缓冲区参数,包括描述符数量、数据区大小等。接下来,DmesgLib类遍历描述符,提取日志文本,并解析元数据,如时间戳和调用者ID。最后,DmesgLib类将提取到的日志数据格式化输出,可以是写入文件或返回结构化数据。解析dmesg的核心在于理解printk_ringbuffer结构,该结构是内核日志的存储和管理机制。