关于 Rust 中类型布局和 ABIs 的笔记 - Faultlore

这是关于 Rust 中类型布局和 ABI 的笔记,包含以下主要内容:

  • 平台解剖:Rust 支持的平台需满足特定条件,如 8 位未对齐字节、布尔为字节等,还支持大端整数/浮点数、16 位指针等,可能支持分段架构等但未充分考虑。
  • 类型解剖

    • 大小:类型的基本属性,Rust 中类型可有 0 大小,泛型函数处理大小动态的类型需用<T:?Sized>
    • 对齐:类型在内存中的位置需是字节数的倍数,大小是对齐的倍数,零大小类型也可有对齐,某些旧的 ABI 对 double 的对齐方式特殊。
    • 偏移:类型字段的相对位置,Rust 中默认用户定义类型的偏移非确定性,有优化和模糊测试的动机,某些注解可诱导确定性字段顺序。
    • 布局:类型的大小、对齐、偏移及字段的递归布局,知道布局可访问字段和转换兼容布局的类型,可通过#[repr(C)]等注解定义布局。
    • ABI:类型的 ABI 决定如何按值传递给 C 函数,Rust 中有 4 种类型种类,整数、浮点数、聚合、向量,聚合和向量的 ABI 取决于字段的 ABI。
    • 内置类型的布局/ABI:给出了 Rust 中核心原语的 ABI 信息,如各种整数、浮点数、指针等类型的大小、对齐、定义值等,数组布局与 C 数组相似,元组布局未指定。
  • 指定布局和 ABI#[repr(C)]等注解可影响类型的布局和 ABI,如#[repr(C)]强制字段按声明顺序布局,#[repr(simd)]给类型向量类型种类等。
  • 扩展随机笔记

    • C 整数层次结构:C 为解决不同平台字节大小和整数大小问题定义了整数层次结构,但精确大小很重要,历史上曾导致一些问题。
    • 字节序:整数和浮点数的字节序有大端和小端之分,如今小端占优势,Rust 支持剩余大端平台。
    • 分段架构:分段架构中相同运行时表示的指针可能指向不同内存区域,存在一些编程模型上的问题。
    • 调用约定:调用约定是 ABI 的一部分,涉及函数参数和返回值的传递方式,现代调用约定通常是混合的,不同架构的调用约定有所不同,如 x86 和 x64 的 System V ABI 在值传递方式上有差异。
阅读 17
0 条评论