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 位子字以大端序方式布局。