是否可以在 ARM (Android/Linux) 上更改字节序的中间执行?

Is it possible to change endianness mid-execution on ARM (Android/Linux)?

我想知道是否可以更改 运行 应用程序在 ARM 平台上执行中的字节顺序。正如你们中的一些人所知,ARM 是双字节序的(同时支持大和小),我想知道是否可以在 Android(或通常的 linux 上)将单个应用程序设置为在执行时使用不同的字节序,或者如果可以在执行过程中更改处理器字节序。

为了避免对此做出一些可能的回应。更改字节序(如果可能的话在应用程序级别)几乎肯定是一个坏主意,但我正在为 ARM 平台构建工具,我想知道我正在使用一组工具的应用程序是否可以做到这一点。此外,即使这样做可能会对其他 applications/OS 造成灾难性后果,我也想知道它是否可以由应用程序完成。

到目前为止,从我对 ARM 的看法来看,似乎只有 OS 可以在这方面设置处理器的模式。但是我还没有找到关于这个问题的明确答案。提前致谢!

这(至少在 ARMv7 和更旧的硬件上)当然是可能的,但您的观点是完全正确的 - 其他任何人,,为了理智,转发- 兼容性和愤怒的内核开发人员,不要在 Linux/Android 中这样做 - 使用 REVREV16REVSHVREV 适当的数据。

在 ARMv6 中引入的 SETEND instruction 允许在任何特权级别切换当前执行状态的字节顺序,但是从 ARMv8 开始,它已被弃用,默认情况下禁用,并且可能在未来完全消失。在 ARMv8 中支持硬件混合字节顺序是可选的。

尽管这是一个糟糕的想法,但它在目前的 Android 应用程序中显然已经司空见惯(在可能的其他用途中,它被认为是在 ARM11 上实现 strcmp() 的最快方式,也许还有Cortex-A8) 32 位任务的 SETEND 仿真最近必须是 added to the arm64 kernel,因此您的工具可能至少也应该意识到这一点。