RFC-0030:FIDL 是小端字节序

RFC-0030:FIDL 采用小端字节序
状态已接受
区域
  • FIDL
说明

声明 FIDL 是小端字节序。

作者
提交日期(年-月-日)2019-01-30
审核日期(年-月-日)2019-01-30

摘要

声明 FIDL 是小端字节序。

设计初衷

通过指定可移植的字节序,使 FIDL 更接近可持久化格式。

初始设计专门选择了主机内存顺序(和表示法),以避免在传输过程中需要对内存进行交换。这对于安全地将 FIDL 消息表示为 C 结构体至关重要。不过,我们知道在近期内在大端机上运行 Fuchsia 的可能性很小,因此将 FIDL 设为小端是明智之举。

设计

目前,FIDL 的文件记录为使用主机字节序,但所有现有主机都是小端序。为了实现可序列化的 FIDL 子集,我们建议暂时声明 FIDL 采用小端字节序(这相当于文档清理)。

如果我们需要支持大端平台,则需要更新许多其他代码和文档,建议届时处理对 FIDL 的任何更改。

实施策略

准备 CL 以更改 FIDL 文档。

在代码中捕获绑定仅在小端机器上使用的预期情况。

工效学设计

人体工学没有任何变化。

文档和示例

仅限规范更改。

向后兼容性

目前没有任何变化。 将限制未来可能的大端设备上的 FIDL,使其需要执行一些混洗操作(对于持久化数据结构,最少)。

性能

当前效果不会发生变化。 如果我们支持大端平台,可能需要进行 FIDL 修订。

安全

安全性没有任何变化。

测试

测试没有任何变化。

缺点、替代方案和未知情况

有两个主要替代方案:

  1. 不提供可序列化性 - 但这会限制 FIDL 在某些用例中的适用性。
  2. 提供单独的持久化格式,但这会导致需要在所有位置支持次级序列化路径。

附录

虽然将 FIDL 修复为小端序的技术决策并非特别有争议,但与许多事情一样,随后也引发了长篇讨论。在其中,我们学习了:

  • MIPS 以前会同时执行 BE 和 LE,具体取决于您在处理器从重置状态恢复时向其计时输入的初始化矢量(在 MIPS 很重要且可以购买独立 MIPS CPU 的时代)。有些产品甚至会在重新启动后切换字节序(不要问为什么)。

    虽然 MIPS 已经不太重要了,但我们预计这些门会嵌入到 SoC 中,并且字节序可能固定(并且可能固定为小端)。

  • 所有 ARM 内核都同时实现大端和小端字节序。

    arm64 可以在 SCTLR 中按 EL 选择它。您可以在异常级别转换时切换字节序模式。

    arm(32) 通过 SETEND 指令进行选择。 它可以在运行时随时切换字节序。 您的编译器不太可能支持此操作,但对于一些手写汇编代码,此操作可能很有用。

  • IEEE 802.11 采用小端字节序:802.11 流量的管理平面和控制平面在其字段中使用小端字节序。所有封装的协议仍然是大端序,802.11 堆栈几乎不会触及。

    历史可以追溯到 1982 年,当时 Xerox 发明了以太网。 WLAN 通常会继承该决策。 选择小端的原因是什么?这是一个任意选择:

    “以太网本身也完全不敏感于将八字节中的位解读为构成八位二进制数值的数字。不过,为了避免不同类型的充电站之间出现不必要的不兼容性,我们任意定义了以下解释:“以太网规范为依据,数据链路层最左边的位(最先传输)是低阶(2^0)位,最右边的位(最后传输)是高阶(2^7)位”

图:数据链路层帧格式

  • USB 采用小端字节序。

  • 琐事:MAC 地址不受字节顺序的影响,但如果地址采用大端序,您肯定可以缩短 IP 路由例程中的几个周期... 甚至可以发起延迟更低的“切断”数据包路由,因为数据包会以字节为单位在古老的 ~1 Mbps 链路上逐字节传入(每毫秒 ~128 字节)。

  • 趣味知识:FAT 文件系统对头文件中的大多数(但不是全部)条目使用小端字节序。如果整个 FAT 引导扇区的校验和(以大端模式读取)为 0x1234,则 FAT 文件系统可用作 Atari ST 上 m68k 处理器的可启动设备,这意味着当前年份实际上仍为 1985 年。

  • 趣味知识:还有一种中端字节序,标准 GCC 定义了这种字节序,并指出:

    “如果 __BYTE_ORDER__ 等于 __ORDER_PDP_ENDIAN__,则 16 位字中的字节采用小端字节顺序排列,而 32 位量值的 16 位子字采用大端字节顺序排列。”