返回

ARMv6/thumb 内核解压时奇怪汇编输出故障排除指南

Linux

ARMv6/thumb 内核解压缩:奇怪汇编输出故障排除

对于任何嵌入式系统开发人员来说,在 ARMv6/thumb 架构(例如 arm1136j-s)上解压缩 Linux 内核时遇到奇怪的汇编输出都是一个令人头疼的问题。这些问题往往会破坏解压缩过程,导致系统启动失败。本文将深入探讨这些问题,分析可能的原因并提供解决方法。

分析症状

当解压缩过程在 arm/boot/compressed/misc.c 中达到 decompress_kernel 时,你可能会观察到以下奇怪的汇编输出:

  • 将输出数据指针存储在 error 符号的地址中,破坏了 error 函数的代码。
  • 将地址 0x55 存储在输出数据指针中,而不是预期的输出数据起始地址。

可能的原因

这些奇怪的输出可能是由以下原因造成的:

编译器优化问题

编译器在 O2 优化级别下可能进行了不适当的优化,导致了错误的代码生成。

交叉编译器问题

用于交叉编译的工具链中可能存在错误,导致了不正确的汇编代码生成。

代码缺陷

提供的 decompress_kernel 函数中可能存在代码缺陷,导致了不正确的操作。

解决方法

要解决这些问题,可以采取以下步骤:

尝试禁用编译器优化

尝试使用较低的优化级别(例如 O0 或 O1)重新编译内核。

检查交叉编译器版本

确保使用的是最新版本的交叉编译器。

仔细检查代码

逐行检查 decompress_kernel 函数的代码,以识别任何潜在的缺陷。

尝试使用不同的汇编器

尝试使用不同的汇编器(例如 GNU as 或 LLVM as)生成汇编代码。

使用调试信息

启用编译器调试信息 (-g),并使用调试器(例如 GDB)来逐步执行代码并识别错误的位置。

报告问题

如果上述步骤无法解决问题,可以向 buildroot 或 Linux 内核社区报告该问题。

结论

ARMv6/thumb 内核解压缩中的奇怪汇编输出可能是由编译器优化、交叉编译器问题或代码缺陷造成的。通过禁用编译器优化、检查交叉编译器版本、仔细检查代码、尝试不同的汇编器以及使用调试信息,你可以识别并解决这些问题,确保内核成功解压缩并启动系统。

常见问题解答

Q1:为什么编译器优化会引起问题?
A1:编译器优化旨在提高代码效率,但有时它可能会过度优化,导致不正确的代码生成。

Q2:交叉编译器中的错误如何影响输出?
A2:交叉编译器将代码从一种架构编译到另一种架构,如果其中存在错误,则会导致不正确的汇编代码生成。

Q3:如何有效地检查代码缺陷?
A3:仔细逐行检查代码,并使用注释和文档来理解其意图。

Q4:为什么尝试不同的汇编器会有所帮助?
A4:不同的汇编器可能使用不同的算法和优化,这可能有助于生成正确的汇编代码。

Q5:调试信息如何帮助识别错误?
A5:调试信息包含有关代码执行的详细信息,这可以帮助你使用调试器逐步执行代码并识别导致问题的位置。