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 过去会根据您在处理器从重置状态出来时(很久以前,当时 MIPS 很重要,并且您可以购买离散的 MIPS CPU)时钟控制的初始化向量来执行 BE 和 LE。有些产品甚至会在重新启动时切换字节序(别问为什么)。

    虽然 MIPS 现在已不再流行,但我们预计门会嵌入在 SoC 中,并且字节顺序可能已固定(可能固定为小端)。

  • 所有 ARM 核心都实现了大端和小端。

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

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

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

    历史可追溯到 1982 年,当时 Xerox 发明了以太网。 WLAN 大多会沿用该决定。 选择小端字节顺序的原因?这是一个任意选择:

    “以太网本身也完全不关心八位字节内位数的解读,即不关心这些位是否构成 8 位二进制数值的数字。 不过,由于采用某种统一的惯例有助于避免不同站类型之间出现不必要的不兼容性,因此将解释任意定义为“以太网规范:数据链路层最左侧的位(第一个传输的位)是低位(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 位子字以大端字节序方式布局。”