3月前
3 条
[linux内存管理] 第029篇 谁把folio的函数定义“藏”起来了?
这篇文章探讨了在阅读Linux内核代码时,如何解决一些函数定义难以找到的问题。作者遇到了folio_test_active()等函数无法找到定义的困惑,通过搜索发现这些函数是通过特殊的宏定义在page-flags.h文件中创建的。文章详细解释了PAGE_TYPE_OPS()和FOLIO_FLAG()宏的工作原理,以及如何通过这些宏定义函数。最终,作者成功理解了这些函数的定义方式,并总结说这种方法虽然特殊,但探索和理解的过程非常有意思。
3月前
评论
【深入内核】ARM64下的内核栈
本文深入探讨了Linux内核栈的运作机制。内核栈是进程生命周期中不可或缺的部分,用于保存用户态和内核态之间的上下文信息。文章解释了内核栈如何通过`task_struct`结构体与进程关联,以及`pt_regs`和`cpu_context`在任务切换和异常处理中的关键作用。此外,文章还详细说明了ARM64架构中`sp_el0`寄存器如何直接存储当前任务的`task_struct`指针,从而优化了栈指针的使用。文章最后讨论了内核栈的配置和栈回溯技术,为内核稳定性问题的分析提供了宝贵的见解。
3月前
评论
【深入内核】内核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 在内存中的增长方向,使读者对环形缓冲区的整体印象更加清晰。
3月前
评论
[LRDP2] 解析插件之dmesg
Linux ramdump parser工具通过解析离线ramdump文件中的内核日志来诊断系统问题。该工具的核心功能是通过DmesgLib类实现的,该类负责读取和分析内核日志。DmesgLib类首先通过读取内核内存中的printk_ringbuffer结构来定位日志数据,然后初始化环形缓冲区参数,包括描述符数量、数据区大小等。接下来,DmesgLib类遍历描述符,提取日志文本,并解析元数据,如时间戳和调用者ID。最后,DmesgLib类将提取到的日志数据格式化输出,可以是写入文件或返回结构化数据。解析dmesg的核心在于理解printk_ringbuffer结构,该结构是内核日志的存储和管理机制。
3月前
评论
[Linux Ramdump Parser] 解析的核心Ramdump实例类的初始化
这篇文章主要介绍了Linux ramdump parser工具中的核心数据结构Ramdump类,以及其常用接口和初始化流程。Ramdump类负责解析和分析Linux内核的崩溃转储文件,并提供了一系列函数接口,以便开发人员可以基于它开发自己的插件。文章详细讲解了以下几个方面的内容: 1. **常用接口**:介绍了Ramdump类中一些常用的接口函数,例如`get_kernel_version`、`address_of`、`field_offset`、`container_of`、`read_cstring`、`read_structure_field`、`read_structure_cstring`和`read_elf_memory`等。这些接口函数分别用于获取内核版本号、获取符号地址、获取结构体成员的偏移量、根据指针获取结构体实例、从指定地址读取字符串、从结构体中读取成员变量和从ELF文件中提取字符串信息等。 2. **Ramdump类的初始化**:详细描述了Ramdump类在初始化过程中进行的操作,包括解析Kconfig配置文件、解析内核符号表、检测vmlinux和dump是否匹配以及加载模块符号表等。这些操作为后续的插件开发提供了必要的信息和基础。 3. **模块符号表加载**:介绍了如何加载模块符号表,包括获取模块符号路径、设置模块符号、解析模块符号和输出模块符号表等。这些操作使得开发人员可以方便地访问和分析模块中的函数和变量。 4. **插件开发**:最后,文章提到了如何使用Ramdump类开发插件,并分析了插件解析dump的逻辑。开发人员可以根据自己的需求,利用Ramdump类提供的接口函数,开发出各种功能强大的插件,以深入分析和调试Linux内核。 总而言之,这篇文章为开发Linux ramdump parser插件提供了详细的指导和参考,对于想要深入了解Linux内核和开发相关工具的开发人员来说,具有重要的参考价值。
3月前
评论
[Linux Ramdump Parser] 解析的入口ramparse.py
深入剖析内存转储分析工具ramparse的参数解析与插件机制,通过OptionParser实现丰富参数管理,并采用插件式架构自动发现和注册解析器,便于功能扩展。解析器继承统一基类,添加新功能无需修改主流程。此外,详述了GNU工具链与本地环境联动配置,提升脚本灵活性与兼容性。
3月前
4 条
[Android稳定性] 第057篇 [方法篇] 高通平台使能ftrace的方法
本文介绍了Linux内核中的Ftrace工具,用于跟踪和分析内核行为。文章详细讲解了使能Ftrace的方法,包括设置相关开关和打开内核trace相关的defconfig。文章还介绍了如何确认Ftrace是否被使能以及查看Ftrace日志的方法。最后,文章提供了一些参考资料供读者深入了解Ftrace。
3月前
1 条
[linux内存管理] 第028篇 do_anonymous_page只处理私有映射吗?
文章摘要:本文探讨了Linux内核中do_anonymous_page()函数的作用,解释了它为什么只处理私有匿名映射。通过分析do_pte_missing()、vma_is_anonymous()、vma_set_anonymous()等函数,以及mmap_region()函数中的逻辑,文章得出结论:在mmap()流程中,只有私有匿名映射的vm_ops会被设置为NULL,从而被do_anonymous_page()处理。其他类型的映射,如共享匿名映射和文件映射,其vm_ops不为空,因此不会被该函数处理。
4月前
2 条
[Android稳定性] 第056篇 [问题篇] 记一例Kernel panic - not syncing: Attempted to kill init!
**问题现场**:系统出现大量I/O和read ERROR,初步怀疑与storage访问相关,进一步分析发现系统正在进行shutdown流程。 **初步分析**:系统当时正在走低电关机流程,且尝试访问磁盘数据时出现IO ERROR,怀疑是下电时序导致storage先下电,导致上层进程访问失败。 **平台回复**:charger相关函数检测到低电后直接调用kernel_power_off执行下电关机,跳过上层shutdown流程,导致上层访问存储设备失败,引发异常。 **解决方法**:删除底层shutdown操作,先走上层关机流程,避免问题发生。 **代码浅析**:正常情况下,上层先走完shutdown流程,再通过syscall让底层继续shutdown。 **补充**:在系统下电流程中,做好时序上的同步非常重要,避免出现竞态访问导致异常。
4月前
4 条
[Android稳定性] 第055篇 从dump信息角度学调度schedule
本文分析了Linux内核中进程调度的流程和上下文切换的细节。在调度过程中,首先关闭抢占,然后调用核心调度函数__schedule,该函数会关闭抢占,选择下一个任务,切换上下文,并最终切换到下一个任务的执行。上下文切换涉及到保存上一个进程的上下文,加载下一个进程的上下文,并最终切换到下一个任务的执行。
4月前
评论
[Android稳定性] 第054篇 [方法篇] 高通平台如何解析ADSP Crash?
本文主要介绍了使用crashman工具解析adsp的方法。首先,需要准备crashman工具、python环境和perl工具。然后,准备解析所需的三个部分:fulldump中的DDRCS0_0.BIN、bp symbols和adsp源码。接下来,通过执行特定的python命令进行解析,并使用ONEMORE集成工具中的adsp crash解析插件来简化解析过程。安装插件前需安装基础工具包。最后,根据工具选项卡中的选项填写相关信息,点击运行即可进行解析。
4月前
1 条
ONEMORE开源软件插件开发指南
OneMore 是一款高度自定义的集成工具,由 PyQt6 和 fluent-widgets 开发,采用侧边导航栏和新建标签页的方式呈现工具功能。OneMore 框架设计包括通用接口、资源文件、主窗口、界面设计界面、账号登录界面、设置界面、通用工具和插件安装目录等。已实现功能包括登录界面、设置界面、导航栏、标签页、插件执行页面、插件市场和软件在线更新插件功能。插件开发指南包括插件组成元素、插件 interface 和插件上传。OneMore 遵循 GPL 协议,允许二次开发,但必须标注原作者。