我听说ARM处理器可以在小端和大端之间切换。处理器为什么需要这个功能?它在安卓手机上使用吗?
我听说ARM处理器可以在小端和大端之间切换。处理器为什么需要这个功能?它在安卓手机上使用吗?
根据处理器的不同,可能可以在运行时切换字节序。旧的处理器将以一种字节序启动,并且预计它们将保持在该状态。在后一种情况下,整个设计通常将被设置为大端或小端之一。
支持混合字节序操作的主要原因是支持网络堆栈,在此堆栈中操纵的基础数据集是本地大端序。这对于交换机/路由器和移动基站非常重要,其中处理器正在运行定义良好的软件堆栈,而不是作为通用应用设备运行。
请注意,在不同的ARM架构中,大端行为有几种不同的实现方式,您需要确切地检查任何特定核心的工作方式。
rev
指令。让我引用Arm的Mali GPU杰出工程师彼得·哈里斯(Peter Harris)的话:
如果你要从内存中加载单个字段,则只需使用小端加载并使用"rev"指令来反转结果——这只是一个额外的指令,速度更快(并且足够小,可以内联,因此避免了函数开销)。
rev
指令会颠倒一个字中的字节顺序。虽然像rev
这样的指令通常不会颠倒字节内的位顺序,但您可以假定位顺序是固定的(调试字节中的位时通常显示为大端序,例如在查看十六进制表示时)。
请注意,任何超过寄存器容量的数字都应由应用程序正确处理;例如,处理128位的代码不仅需要考虑字节的顺序,还需要考虑2个64位字的顺序。
你可以切换字节序,但在操作系统启动后这样做会导致问题。如果你要这样做,你需要在引导过程的早期阶段进行。当你的应用程序运行时,字节序已经被选择并且不会改变。
为什么要这样做?唯一的原因是,如果你正在编写需要处理大量小端数据的嵌入式软件,或者运行一个假定为小端而没有固定为端无关的程序。这种数据通常来自于以其本地字节顺序(x86为小端)编写输出的x86应用程序。除此之外,没有太多其他的理由去这样做。你会发现ARM几乎完全在大端模式下运行。