39个版本 (15个稳定版)

2.0.0 2024年6月24日
1.2.2 2023年12月17日
1.2.0 2023年7月24日
1.1.5 2022年12月3日
0.0.10 2020年3月23日

#29硬件支持

Download history 2903/week @ 2024-04-30 2073/week @ 2024-05-07 2433/week @ 2024-05-14 2042/week @ 2024-05-21 2129/week @ 2024-05-28 1736/week @ 2024-06-04 1822/week @ 2024-06-11 1429/week @ 2024-06-18 1186/week @ 2024-06-25 1259/week @ 2024-07-02 1821/week @ 2024-07-09 1775/week @ 2024-07-16 1138/week @ 2024-07-23 1278/week @ 2024-07-30 923/week @ 2024-08-06 881/week @ 2024-08-13

每月下载量4,414
用于 14 个Crates(11个直接使用)

0BSD 许可证

8.5MB
105K SLoC

yaxpeax-x86

crate documentation

yaxpeax项目的一部分,实现了由 yaxpeax-arch 提供的特质。

Rust用户可以使用此库的快速简单的API,或者更通用的来自 yaxpeax-arch 的解码接口,适用于混合使用 yaxpeax-x86 与其他 yaxpeax 解码器,例如 yaxpeax-arm。两种风格的示例都在文档中提供。

ffi/ 目录提供了适用于非Rust调用者(如C或C++)的 yaxpeax-x86 重新包装版本。请参阅 examples 目录以了解此库的FFI使用。

特性

  • #[无std]
  • 可配置指令集扩展
  • 非常快
  • 非常小?

#[无std]

yaxpeax-x86 提供的解码器旨在在 no_std 设置中可用,并默认如此。若要在没有 std 的情况下构建 yaxpeax_x86,请将参数 default-features = false 添加到您的 yaxpeax-x86 依赖项中;yaxpeax_x86FFI包装 也这样做,并且无需Rust标准库即可构建。可以在没有 std 的情况下启用serde,但在该模式下json序列化/反序列化需要小心处理。此外,还有 colors 特性,用于使用默认(例如,适合终端的)语法高亮显示指令。

指令集扩展

yaxpeax-x86 解码器提供了指定在解码时哪些 指令集扩展 可用的选项,以支持解码特定微架构理解的 x86 指令。在 yaxpeax_x86 中的解码器的默认实现采用了一种乐观的解码方法,并假定所有功能集都可用,同时接受围绕未定义编码的 intel 特定和 amd 特定的问题。

yaxpeax-x86 解码长模式(amd64/x86_64)、保护模式(x86/x86_32)和实模式(x86_16)指令。在大多数情况下,ISA 扩展在不同的模式中解码是等效的;这是支持的所有扩展的完整列表

3dnow*, sse*, sse2*, sse3, ssse3, sse4.1, sse4.2, sse4a, avx, avx2, avx512**, syscall, cmpxchg16b, fma3, aesni, popcnt, rdrand, xsave, sgx, monitor, movbe, sgx, bmi1, bmi2, invpcid, mpx, adx, clflushopt, pcommit, sha, gfni, pclmulqdq, rdtscp, abm, xop, skinit, tbm, svm, f16c, fma4, tsx, enqcmd***, uintr***, keylocker***, store_direct***, cet***, sev/snp***

*: 3dnowssesse2x86_64 中是非可选的,因此不允许构建拒绝这些指令的解码器。 x86_32x86_16 可能有拒绝这些指令以实现真正的 8086i386 兼容性的功能,但目前没有。

**: avx512 完全支持,但不支持拒绝 avx512 家族子集的解码器。如果您需要细粒度的 avx512 兼容性控制,请提交一个问题。

***: 特征位的空间用完了。InstDecoder 当前是一个 u64,并且所有 64 位都用于将 x86 特性映射到 cpuid 位。将这些作为可选指令支持需要将其扩展为 u64 对。由于典型情况是解码所有内容,因此无论 InstDecoder 设置如何,都会解码这些指令。将 InstDecoder 扩展为 u128 可能是可接受的,但尚未进行基准测试。

非常快

当连接到disas-bench时,yaxpeax_x86::long_mode的解码吞吐量约为250MB/s,在某些硬件上是最快的软件x86解码器。解码器中可能经过的路径,即通过``::decode_into`,在zen2核心上平均为58个周期。

尽管有一个仓库内基准测试,但我认为它过于不切实际,因此选择使用disas-bench,直到它提供更多信息。

非常小?

yaxpeax_x86::long_mode自带的代码和数据大小约为143KB。加上指令格式化的数据,增长到249KB。虽然代码大小可以缩小一些,但该crate的大部分是几个查找表——通过``的解码逻辑的热路径保持在约5KB的代码函数中,以及大量为不太可能出现的指令提供支持的逻辑。

yaxpeax_x86可能是完全专注于解码和指令格式化的任务中最小的库,但该crate没有针对此目的进行广泛的测试。

镜像

yaxpeax-x86的规范副本位于https://git.iximeow.net/yaxpeax-x86/

yaxpeax-x86也在GitHub上镜像,地址为https://www.github.com/iximeow/yaxpeax-x86

不安全性

yaxpeax_x86经常使用`unsafe { unreachable_unchecked()); {}`,偶尔使用`unsafe { _.get_unchecked()); {}`来提高性能。通过`mishegos`对`yaxpeax_x86`进行模糊测试,并在没有问题的前提下通过了多天的模糊测试。

变更日志

跨crate版本的范围的变更日志在仓库中的`CHANGELOG`文件中维护,以及在线

贡献

遗憾的是,向位于`git.iximeow.net`的规范仓库推送提交是不可能的。如果您想贡献——谢谢!——请将补丁发送到iximeow提交的电子邮件,或在GitHub镜像上打开PR。两个远程都保持同步。

另请参阅

iced是另一个非常好的x86_64解码器,也是用rust编写的。它作为crate的一部分提供了关于指令语义的额外信息,以及重新编码指令的能力。

disas-bench是几个包括yaxpeax-x86在内的x86_64解码器的实用基准。

mishegos是一个差异模糊器,它大大简化了对yaxpeax-x86正确性的测试。

依赖关系

~0.2–5.5MB
~15K SLoC