RFC-0030:FIDL 是小端字节序 | |
---|---|
状态 | 已接受 |
领域 |
|
说明 | 将 FIDL 声明为小端字节序。 |
作者 |
|
提交日期(年-月-日) | 2019-01-30 |
审核日期(年-月-日) | 2019-01-30 |
总结
将 FIDL 声明为小端字节序。
设计初衷
通过指定可移植的字节序,使 FIDL 更接近于可持久化格式。
初始设计专门选择了主机内存顺序(和表示法),以避免在传输过程中需要调配内存。这是将 FIDL 消息安全地表示为 C 结构体的关键。不过,我们认识到,很快在大端字节序机器上运行 Fuchsias 的可能性很小,因此将 FIDL 设置为小端字节序是切实可行的决策。
设计
目前,FIDL 记录为使用主机端字节序,但所有现有主机都采用小端字节序。 为了迁移到可序列化的 FIDL 子集,我们建议暂时声明 FIDL 采用小端字节序(这相当于对文档进行清理)。
如果我们是否需要支持一个大型端序平台,许多其他代码和文档将需要更新,建议那时处理对 FIDL 所做的任何更改。
实施策略
准备 CL 以更改 FIDL 文档。
满足以下预期:绑定仅在采用小端字节序的机器上以代码中的断言的形式使用。
工效学设计
工效学设计没有变化。
文档和示例
仅限规范更改。
向后兼容性
目前没有任何变化。 将限制未来潜在的大端字节序设备上的 FIDL 需要进行一些调配(至少对持久性数据结构而言)。
性能
当前效果没有变化。 如果我们支持大端字节序平台,则可能需要进行 FIDL 修订。
安全性
安全方面没有变化。
测试
测试没有变化。
缺点、替代方案和未知情况
有两个可用的备选方案:
- 不提供可序列化,但这会限制 FIDL 在某些用例中的适用性。
- 提供单独的可持久化格式,但这会导致需要在所有地方都支持辅助序列化路径。
附录
虽然将 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 位子字则会以大端字节序排列。”