#byte #byte-slice #abi #abstraction #low-level #layout #native

nightly no-std abio

与原生操作系统ABI交互的安全抽象

1个不稳定版本

0.3.0 2023年7月31日

#331 in FFI

MIT许可证

130KB
2K SLoC

abio

abio是一个低级crate,用于在原始字节切片上执行端序感知操作,使用零拷贝序列化和反序列化例程将数据转换为和从具体类型转换。

您可以在官方的crate文档中找到有关此crate API的更多信息。

设计/目的

这个crate试图实现"安全转换"

无I/O操作

这个crate通过通过特性行使一系列合同,提供自己的自定义ABI。它直接在二进制数据或字节上操作,代码库的任何地方都没有实际进行I/O操作。这种设计方法深受其影响,它允许将读取和写入逻辑从I/O本身解耦。更具体地说,这个crate对字节来源保持中立。

可预测的类型布局

当您使用标准Rust ABI而不指定#[repr(..)]属性时,Rust编译器有自由在内存中任意布局您的数据结构。这意味着布局可能会在不同编译器版本、优化级别或不同的编译目标之间发生变化。因此,标准Rust ABI不会对您的类型内存布局提供任何保证。

这并不一定意味着布局会改变或变得非确定性,而更准确地说,如果你需要稳定的内存布局,这不是你应该依赖的东西。

如果你需要从/到你的数据结构中读取和写入原始字节,并且需要它可靠且稳定地工作,那么你应该使用#[repr(..)]属性之一来指定你的数据结构的布局。例如,#[repr(C)]常用于此目的,因为它指定你的数据结构应具有与C相同的内存布局,这是一个稳定且定义良好的布局。

稳健性

创建没有基于具有可预测布局的应用程序二进制接口(ABI)的代码,可以轻易地引入不稳健性。然而,这个crate在面临权衡时,优先考虑安全性而不是性能,因为如果没有稳健和安全的代码,高性能变得微不足道。因此,它旨在在这两个因素之间寻求最佳平衡,这可以说是最务实的方法。

项目目标

  • 性能与类似crate(如bytemuckscrollzerocopy)相当。
  • 提供安全、灵活且人性化的API来操作字节。
    • 未来可能会通过shims模块提供逃生门。
  • 尽可能在编译时使用const函数和评估来评估。
    • 使用derive特性时,类型在编译时得到验证。
    • 利用编译器对自由常量的优化,以确保没有运行时成本。
  • 对一级目标平台完全无关。如果可能,将支持二级目标,然后是三级目标,按此顺序。
  • 支持所有合格平台上的simdatomics
  • 使用端序感知子例程在运行时对类型进行解码和编码。
  • no-std环境提供一级支持。
    • 与堆相比,在栈上存储数据,这在某些环境中可能不可访问。
  • 使用零拷贝解码和编码操作。
  • 避免不必要的分配。
  • 类似读取的操作使用不可变、借用数据来允许并行化。
  • 定义一个一致的ABI,类似于宿主操作系统的“系统”ABI,这通常只是“C”。
  • 待定

项目非目标

  • 输入/输出支持(文件、套接字、句柄等)
    • 支持与文件、套接字和其他资源一起工作超出了这个crate的范围。
  • 添加FFI绑定或平台特定实现。
    • #[cfg(..)] 条件编译是完全可以接受的,但这个库并不是专为运行在任何特定操作系统而设计的。
  • 待定

这个库适合你吗?

这个库不会执行任何系统调用以打开、读取、刷新和/或关闭文件、套接字或其他相关操作系统资源。相反,这个库提供了构建在文件和网络I/O等更高层抽象之上的有用原语。这个库在开发二进制文件格式解析器、自定义网络协议或在更安全、更可控的方式下与FFI协同工作时也非常有用。

如果你正在寻找具有这种行为的更高层库,那么这个库可能不适合你。

开发状态

该项目正在积极开发中。

寻求贡献者

我们正在积极寻求贡献者,尤其是那些能够协助编写和维护文档的人。正确记录一个库需要大量的努力和时间,这会从实现新功能、编写新测试、添加基准测试等任务中分心。

贡献

除非你明确声明,否则你提交给abio的任何有意贡献都应许可为MIT,不附带任何额外条款或条件。

许可

此软件根据MIT许可证许可。

依赖

~110KB