#stack #portable #safe #routines #unsafe #pointers #control

no-std psm

可移植堆栈操作:堆栈操作和内省例程

22 个版本

使用旧的 Rust 2015

0.1.21 2022 年 9 月 24 日
0.1.20 2022 年 7 月 23 日
0.1.18 2022 年 4 月 2 日
0.1.17 2022 年 2 月 15 日
0.1.2 2018 年 12 月 29 日

176Rust 模式

Download history 237712/week @ 2024-03-14 243526/week @ 2024-03-21 251787/week @ 2024-03-28 245793/week @ 2024-04-04 249980/week @ 2024-04-11 247498/week @ 2024-04-18 200181/week @ 2024-04-25 208013/week @ 2024-05-02 207461/week @ 2024-05-09 220959/week @ 2024-05-16 227911/week @ 2024-05-23 223792/week @ 2024-05-30 217459/week @ 2024-06-06 234513/week @ 2024-06-13 229933/week @ 2024-06-20 185937/week @ 2024-06-27

907,989 每月下载量
用于 1,152 个 crate (5 个直接)

MIT/Apache

76KB
1.5K SLoC

GNU Style Assembly 1K SLoC // 0.1% comments Rust 267 SLoC // 0.1% comments Assembly 140 SLoC // 0.2% comments

可移植堆栈操作

该 crate 提供了非常可移植的函数来控制堆栈指针并检查堆栈属性。该 crate 不试图提供对任何操作的任何安全抽象,唯一的目标是正确性、可移植性和效率(按此顺序)。因此,您在这个 crate 中看到的大多数函数都是不安全的。

除非您正在编写堆栈操作的堆栈抽象,否则这不是您想要的 crate。相反,请考虑这个 crate 的安全抽象之一。一个好的地方是查看 crates.io 的反向依赖列表。

平台支持

以下表格列出了支持的目标和架构,并附有当前支持和目标知识的说明。三列“可用”、“测试”和“调用堆栈”表示支持级别逐渐提高。

  • “可用”基本上意味着代码可以构建,并为该目标生成了汇编文件;
  • “测试”意味着汇编代码已经过测试或以其他方式验证为正确。对于大多数目标,这也意味着已经设置了持续集成;
  • “调用堆栈”意味着汇编代码已经以适当的方式编写,以支持堆栈回溯和显示调用帧(即 gdb backtrace 可以按预期工作)。
目标 支持
架构 操作系统 可用 测试 调用堆栈
注释
x86_64 apple-ios

本地测试了目标。

windows 是,但已禁用

在 Windows 上以常规方式分配的堆栈在 Windows 上不可用,并且正确分配堆栈的函数是 Windows 实现细节。作为(不必要地慢和灵活)的替代方案,使用 Fibers

*
i686
i586
i386
apple-ios 未知 未知
linux-android 未知 未知 未知

汇编文件可用,但尚未验证目标是否可以构建

windows

代码在我的本地机器上技术上是可以工作的,但在AppVeyor上异常处理没有正确工作,这使得我不愿将其标记为已工作。

在 Windows 上以常规方式分配的堆栈在 Windows 上不可用,并且正确分配堆栈的函数是 Windows 实现细节。作为(不必要地慢和灵活)的替代方案,使用 Fibers

*
aarch64 apple-ios 未知

aarch64-apple-ios尚未测试。运行这些测试需要iOS硬件。

fuchsia
unknown-cloudabi
未知 未知
windows

在 Windows 上以常规方式分配的堆栈在 Windows 上不可用,并且正确分配堆栈的函数是 Windows 实现细节。作为(不必要地慢和灵活)的替代方案,使用 Fibers

*
arm
armv7
apple-ios 未知 未知

armv7-apple-ios尚未测试。运行这些测试需要iOS硬件。

windows

在 Windows 上以常规方式分配的堆栈在 Windows 上不可用,并且正确分配堆栈的函数是 Windows 实现细节。作为(不必要地慢和灵活)的替代方案,使用 Fibers

*
armv5te * 未知 未知 未知
thumbv6
thumbv7
* 未知 未知 未知
mips
mipsel
linux

仅支持o32 ABI,并将用于所有32位MIPS目标。

mips64
mips64el
linux
powerpc linux

在程序中某些已定义的范围内调用堆栈生成可能失败,尽管通常的编译器生成的代码在类似点也会失败。

powerpc64 linux

在程序中某些已定义的范围内调用堆栈生成可能失败,尽管通常的编译器生成的代码在类似点也会失败。

AIX
powerpc64le linux

在程序中某些已定义的范围内调用堆栈生成可能失败,尽管通常的编译器生成的代码在类似点也会失败。

s390x linux 本地

CI上的测试运行器挂起,已在qemu-system-s390x虚拟机上进行了本地验证。将来可能通过qemu的全系统仿真添加CI测试。

sparc linux 未知 未知 未知

存在32位SPARC的Rust目标,但实际上没有Linux发行版有32位SPARC发行版,因此验证不可行。

实际的汇编代码已保守编写,模仿了64位SPARC代码,因此有一定的可能性能工作。

sparc64 linux 本地

已在GCC Farm Project机器上手动验证其工作。将来可能通过qemu的全系统仿真添加CI测试。

sparc9 solaris 未知 未知

使用与sparc64-linux-gnu目标相同的汇编代码。该目标没有rustc构建,因此目前无法验证该目标的正确运行。

wasm *

此库不适用于目标。WASM没有指定的C ABI,调用堆栈甚至不在地址空间中,看起来也无法操作。

asmjs *

可行性和必要性尚未确定。

nvptx *

可行性和必要性尚未确定。

msp430 *

尚未着手...

riscv32 * 未知

虽然汇编代码尚未测试,但它直接复制了64位版本。除非有非显而易见的错误,否则应该能正常工作。

riscv64 * 本地 未知

已在本地使用C调用者测试了riscv64的汇编代码。

loongarch64 * 本地 未知

已在本地使用C调用者测试了loongarch64的汇编代码。

许可

PSM许可采用以下之一

任选其一。

无运行时依赖

~180KB