在 ARM 上切换字节顺序

问题描述 投票:0回答:3

我听说ARM处理器可以在小端和大端之间切换。处理器需要这个做什么?安卓手机上用吗?

android arm cpu-architecture endianness processor
3个回答
6
投票

根据处理器的不同,可以动态切换字节顺序。较旧的处理器将以一种字节序状态启动,并且预计会保持该状态。在后一种情况下,整个设计通常会设置为大端或小端。

支持混合字节序操作的主要原因是支持网络堆栈,其中所操作的底层数据集是本机大字节序。这对于交换机/路由器和移动基站来说非常重要,其中处理器运行定义良好的软件堆栈,而不是作为通用应用设备运行。

请注意,在不同的 ARM 架构中,大端行为有多种不同的实现,您需要准确检查它在任何特定内核上的工作原理。


2
投票

没有处理器需要以大或小字节序运行。原因很简单:在一种模式下可以做的任何事情,在另一种模式下也可以做。当然,对于任何图灵完备的计算机来说,这通常都是正确的,但一般来说,CPU 都有指令来反转字内的数据。

在ARM中,这条指令似乎被称为

rev
指令。让我引用 Arm 的 Mali GPU 杰出工程师 Peter Harris 的话:

如果您打算执行从内存加载单个字段的函数,那么只需使用小端加载并使用 “rev”指令 来反转结果 - 它只是一个额外的指令,并且速度更快(并且足够小,可以内联)这样你也可以避免函数开销)。

rev
指令反转字中的字节。尽管诸如
rev
之类的指令通常不会反转字节内的位,但您可以假设位顺序是固定的(调试时,字节中的位通常显示为大端字节序,例如,在查看十六进制表示形式时 - 假设索引从左侧开始)。

请注意,任何大于寄存器所能容纳的数字都应由应用程序正确处理;例如,处理 128 位的代码不仅需要担心字节的顺序,还需要担心 2 x 64 位字的顺序。


-4
投票

您可以切换字节顺序,但在操作系统启动并运行后就不会这样做。 这只会把事情搞砸。 如果您打算这样做,那么您应该在启动顺序的早期就这样做。 当您的应用程序运行时,字节序已选择并且不会更改。

你为什么要这么做? 唯一真正的原因是,如果您正在编写必须处理大量小端数据的嵌入式软件,或者运行一个假设小端字节序编写的程序,并且未固定为与字节序无关。 此类数据往往来自 x86 应用程序,该应用程序以其本机字节顺序(x86 是小端字节序)写出内容。 没有太多其他理由这样做。 您会看到 ARM 几乎完全以大端模式运行。

© www.soinside.com 2019 - 2024. All rights reserved.