是否可以在 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 be
和 setend 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 中这样做 - 在数据上酌情使用 REV
、REV16
、REVSH
或 VREV
。
在 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)上更改字节顺序?的主要内容,如果未能解决你的问题,请参考以下文章