与其在设备崩溃后复制和解析完整的随机存取存储器转储,不如只收集您所需要的调试信息?这样可以减少进行传输和存储所需要的时间和资源,并且可以更加有效地研究信息。
高通科技公司用于进行随机存取存储器转储收集的基础设施位于专有的启动固件中,可支持在本公司的片上系统(SoC)上进行小型转储。高通创新中心(QUIC)开发的小型转储驱动程序只需要您所指定的内存区域就可以收集完整的随机存取存储器转储或小型转储。我们正在上传的驱动程序可确保客户端内核模块以及核心内核能够预先指定所要捕捉的、用于调试的最少信息。
信息过量,以及相关问题
在使用现场设备或测试场内设备时,通过高通科技公司固件中的工程模式可以针对内核和非内核崩溃情况生成完整的随机存取存储器转储。然后,您可以进行事后调试。
但是,在用户设备上,发生故障时进行完整的随机存取存储器转储可能会导致信息过量。在用户设备上根本无法捕捉和存储超过12GB的数据,更不用说通过无线网络传输数据进行调试了。而且,从安全性的角度来看,随机存取存储器转储可能包含用户不想共享的敏感数据。有很多理由可以减少收集和发送用于分析的内存转储。
小型转储的基础设施是启动固件的组成部分。近年来,我们一直在向客户提供小型转储的内核驱动程序,并以全新的方式应用于汽车、扩展现实、移动宽带和物联网等领域。但是,我们发现,在安卓的通用内核映像(GKI)中,很难获得有关崩溃调试的有用信息。这一情况导致我们分享了在系统崩溃后收集最少有用调试数据的常见问题。我们已经在启动固件和一个小型转储内核驱动程序中编写了解决问题的方法,目前我们正在上传该驱动程序。
小型转储驱动程序
高通科技公司的启动固件提供了通过各个协处理器和子系统收集注册区域的核心基础设施,其中包括:
- 音频数字信号处理器(ADSP)
- 计算数字信号处理器(CDSP)
- 调制解调器
- 运行安卓和Linux程序的应用处理器子系统(APSS)
我们的小型转储驱动程序可确保客户端内核模块能够注册所要收集的区域。您可以按照小型转储文档中的说明,在安全寄存器中设置位,以确保在固件中启用小型转储:
+同样可以写入sysfs节点,从而将模式设置为小型转储:
然后,当启动固件被崩溃触发时,小型转储仅收集您通过内核注册的区域,或通过在片上系统运行的其他子系统注册的区域。结果得到的信息比完整的系统随机存取存储器转储要少,但是这属于对您而言最有价值的信息。
启动固件中的崩溃处理程序可以由内核紧急或子系统崩溃(例如:如片上网络(NOC)或总线错误)触发,也可以由看门狗侵蚀或固件紧急触发。
关于kdump和pstore的情况?
当然,目前已有在崩溃后收集调试信息的解决方案。
利用kdump,您可以使用任何用户空间收集随机存取存储器转储,然后对其进行保存或发送。但是,kdump保留了很大区域的宝贵内存(arm64为128 MB)。kdump需要两次内核启动 – 一次用于内核崩溃,另一次用于启动正常内核 – 以恢复正常操作。而且,只有内核可以触发kdump,因此在发生类似网络操作中心错误的情况时,kdump无用。
另一个工具是pstore,它具有较低的内存开销,并且不需要额外的内核启动。但是,我们发现,在收集并将随机存取存储器转储复制到oops设备所需要的时间方面还有改进的空间。pstore需要为ramoops区域预留内存,而这是我们想要避免出现的情况。另外,pstore收集仅限于内核在崩溃前能够可靠地复制的内存。这意味着在内核紧急状态下,pstore可能无法捕捉所有信息,也无法捕捉内核紧急状态通知程序路径等详细信息。
小型转储工作流
本公司的小型转储驱动程序旨在最大限度地减少捕捉和发送小转储到固件的内存开销。该驱动程序保持了一份物理地址和规模表,并且不需要复制dmesg缓冲区或ftrace缓冲区之类的信息。然后,固件将小型转储区域直接捕捉到存储中,从而减少了收集时间。
该实施方案使用了各种目录表,而每个目录表均具有您在发生崩溃时想要收集的区域列表。如下图所示,这是一种两阶段查询表。
通常情况下,目录表中的每一个条目均对应于一个特定的子系统。例如,如要调试Linux子系统中的崩溃,您可以列出该类区域。如果想要收集该类区域中的日志缓冲区或ftrace缓冲区,则需要注册其物理地址。
如在配备了高通科技处理器的设备上发生了小型转储崩溃,则:
1. 设备将会重启;
2. 固件将会全面查看各个目录表;
3. 固件将收集可执行与可链接格式(ELF);
4. 固件将可执行与可链接格式复制到芯片可用的任何存储设备(嵌入式多媒体卡、通用闪存、安全数字卡等)。
轮到你了:简单了解我们的实施方案
小型转储支持高通科技的远程处理器区域(例如:调制解调器),并且已经在上游提供高级数字信号处理支持。在片上系统及其子系统由于各种硬件和软件错误而崩溃的前提下,我们构建了这一小型转储实施方案,以收集各个内核区域。
我们的目标是与想要将其与崩溃转储解决方案集成的其他片上系统供应商共享该实施方案。我们付出了大量努力上传该实施方案,并将大部分时间用在如何使用现有解决方案或构建通用程序的社区讨论中。随着工作的持续进行,我们采纳了社区的建议,并在Linux管道开发人员大会上提交了“终端用户设备崩溃调试用小型转储”报告。请查看有关实施方案的更多细节,包括我们希望在将来捕捉的调试信息类型。
骁龙与高通品牌产品均属于高通科技公司和/或其子公司产品。
相关博客:
有关Vulkan的高阶滤波和区块匹配新图像处理扩展提高了性能并降低了功耗
用户空间应用程序编程接口兼容性检查器:在Linux内核中检测用户空间破坏情况的自动化工具
利用Bazel、Kleaf和设备驱动程序开发包构建外部安卓内核模块 – 你准备好了吗?
Gunyah管理程序软件 – 支持在安卓虚拟化框架下所保护的虚拟机
相关标签:
在所发布内容中表达的观点仅为原作者的个人观点,并不代表高通公司或其子公司(以下简称为“高通公司”)的观点。所提供的内容仅供参考之用,而并不意味着高通公司或任何其他方的赞同或表述。本网站同样可以提供非高通公司网站和资源的链接或参考。高通公司对于可能通过本网站引用、访问、或链接的任何非高通公司网站或第三方资源并没有做出任何类型的任何声明、保证、或其他承诺。