【问题标题】:Switching endianness on ARM在 ARM 上切换字节顺序
【发布时间】:2019-09-21 15:24:21
【问题描述】:

我听说 ARM 处理器可以在 little-endian 和 big-endian 之间切换。处理器需要这个做什么?它在安卓手机上使用吗?

【问题讨论】:

  • 主要是营销复选框。默认情况下,基于 arm 指令集的产品列表非常少,它们是大端的。无论如何,大端模式并不是您所想的,它们在较新的内核上有处理字节交换的指令。让工具链工作等是一个 PITA。
  • 英特尔收购了 DEC 可能是为了粉碎 alpha,但副作用是强臂变成了默认为大端的 xscale(现在由 Marvell 拥有的产品线)。当时是字不变的(BE-32)(arm 的较新内核是 BE-8,字节不变,你可以拥有一个或另一个,而不是两者)。当时很难让工具链工作(gnu/gcc),但现在更容易,尽管 BE-8 更复杂。
  • 较新的内核具有可以切换模式和切换回的指令,因此您可以拥有临界区。较旧的核心是一个全局设置,您非常希望使整个系统成为大端。

标签: android arm processor cpu-architecture


【解决方案1】:

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

支持混合端操作的主要原因是支持网络堆栈,其中被操作的底层数据集是本机大端。这对于处理器运行定义明确的软件堆栈而不是作为通用应用设备运行的交换机/路由器和移动基站而言意义重大。

请注意,在不同的 ARM 体系结构中有几种不同的大端行为实现,您需要准确检查它在任何特定内核上的工作方式。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 手臂是小端,手臂上的大端是例外。
    • 这只对 ARMv6 和大多数 ARMv7 是正确的。在 ARMv8 中,字节序是动态的(并且仅适用于数据端)。
    猜你喜欢
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 2021-08-07
    相关资源
    最近更新 更多