是否可以在 ARM(Android/Linux)上更改字节顺序?

Posted

技术标签:

【中文标题】是否可以在 ARM(Android/Linux)上更改字节顺序?【英文标题】:Is it possible to change endianness mid-execution on ARM (Android/Linux)? 【发布时间】:2015-02-25 17:17:52 【问题描述】:

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

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

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

【问题讨论】:

技术上可以在 SOME ARM CPU 上使用。 setend besetend le 在 this duplicate question 中。 setend will manipulate the CPSR E-bit 在上下文切换时保存/恢复,因此 Linux 下的应用程序可以安全地执行此操作。 虽然另一个问题确实提供了一些有趣的上下文作为示例,但提出的实际问题却大不相同 - 一个询问如何转换数据和更改 CPU 模式只是一种建议的方法。这更多是关于遇到某人切换 CPU 模式的可能性 - 这确实提供了一个示例。 @ChrisStratton 接受的答案似乎对任何一个都有效。如果你解析每个单词,它是不同的。对我来说,它具有所有相同的信息,所以它是相同的。我认为“重复”的目的是在以略微不同的方式提出问题时链接信息。 被问到的问题非常不同。至少有一位版主认为,有相同的答案是一个线索,但不足以使不同的问题重复:meta.***.com/questions/278961/… 由于答案的普遍性(使用 linux SETEND API 函数),我建议相应地更改问题。 【参考方案1】:

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

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

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

【讨论】:

感谢您的回复!这基本上完全回答了我的问题。应用程序开发人员做这种事情有点糟糕。 SETEND 可能会执行得更快,因为它可以一次翻译多条指令;而不是ldr rx, [mem]rev rX。 ARMv8 可能应该重新编译应用程序,我希望它是一个宏。但这是一个很好的观点。

以上是关于是否可以在 ARM(Android/Linux)上更改字节顺序?的主要内容,如果未能解决你的问题,请参考以下文章

在 ARM 目标上运行 perf

ubuntu上构建arm64的镜像

office365可以安装armwindows

是否可以为 ARM 模拟 Windows 8?

如何在ARM / MIPS平台上检查XN / XI位支持的硬件支持

是否可以在 x86 机器中加载核心文件(由 arm 处理器生成)?