RFC-0030:FIDL 是小端字节序

RFC-0030:FIDL 是小端字节序
状态已接受
领域
  • FIDL
说明

将 FIDL 声明为小端字节序。

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

总结

将 FIDL 声明为小端字节序。

设计初衷

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

初始设计专门选择了主机内存顺序(和表示法),以避免在传输过程中需要调配内存。这是将 FIDL 消息安全地表示为 C 结构体的关键。不过,我们认识到,很快在大端字节序机器上运行 Fuchsias 的可能性很小,因此将 FIDL 设置为小端字节序是切实可行的决策。

设计

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

如果我们是否需要支持一个大型端序平台,许多其他代码和文档将需要更新,建议那时处理对 FIDL 所做的任何更改。

实施策略

准备 CL 以更改 FIDL 文档。

满足以下预期:绑定仅在采用小端字节序的机器上以代码中的断言的形式使用。

工效学设计

工效学设计没有变化。

文档和示例

仅限规范更改。

向后兼容性

目前没有任何变化。 将限制未来潜在的大端字节序设备上的 FIDL 需要进行一些调配(至少对持久性数据结构而言)。

性能

当前效果没有变化。 如果我们支持大端字节序平台,则可能需要进行 FIDL 修订。

安全性

安全方面没有变化。

测试

测试没有变化。

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

有两个可用的备选方案:

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

附录

虽然将 FIDL 修复为小端字节序的技术决策并没有特别的争议,但与许多情况一样,最终却是一个很长的线程。在本课中,我们学习了以下内容:

  • MIPS 过去会同时执行 BE 和 LE,具体取决于您在处理器重置时(在很久以前 MIPS 很重要,以及您可以购买独立 MIPS CPU 的时段)时记入处理器的 init 矢量。某些产品甚至在重新启动后切换了字节顺序(不要询问原因)。

    虽然 MIPS 已不再是大事,但我们希望门嵌入 SoC 中,并且字节序可能是固定的(并且可能会固定为很小)。

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

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

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

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

    历史可以追溯到 1982 年,当时施乐发明了以太网。 WLAN 基本上会继承该决定。为何选择小端字节序?这是一个任意选择:

    “以太网本身也完全不易将一个八位字节中的位解释为由 8 位二进制数值组成的数字。 但是,由于某些统一的惯例很有帮助,以避免不同电台类型之间不必要的不兼容,因此系统将任意定义为“ETHERNET SPECIFICATION:数据链路层”。最左边的位(首先传输)是低阶 (2^0) 位数,最右边的位(最后传输的)^7”是高位 ^7

图:数据链路层帧格式

  • USB 为小端字节序。

  • 小知识:MAC 地址不受字节排序的影响,但如果地址采用大端字节序,那么您肯定可以在 IP 路由例程中缩短几个周期...甚至可以对数据包进行低延迟的“直通”路由,在古老的大约 1 Mbps 链路(每毫秒约 128 个字节)上逐字节传输。

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

  • 趣味知识:此外,还有标准 GCC 定义中间端字节,并注意:

    “如果 __BYTE_ORDER__ 等于 __ORDER_PDP_ENDIAN__,则 16 位字中的字节会以小端字节序排列,而对于 32 位数,则 16 位子字则会以大端字节序排列。”