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 在 硬件支持
每月下载量4,414
用于 14 个Crates(11个直接使用)
8.5MB
105K SLoC
yaxpeax-x86
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_x86 的 FFI包装 也这样做,并且无需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***
*: 3dnow、sse 和 sse2 在 x86_64 中是非可选的,因此不允许构建拒绝这些指令的解码器。 x86_32 和 x86_16 可能有拒绝这些指令以实现真正的 8086 和 i386 兼容性的功能,但目前没有。
**: avx512 完全支持,但不支持拒绝 avx512 家族子集的解码器。如果您需要细粒度的 avx512 兼容性控制,请提交一个问题。
***: 特征位的空间用完了。InstDecoder 当前是一个 u64,并且所有 64 位都用于将 x86 特性映射到 cpuid 位。将这些作为可选指令支持需要将其扩展为 u64 对。由于典型情况是解码所有内容,因此无论 InstDecoder 设置如何,都会解码这些指令。将 InstDecoder 扩展为 u128 可能是可接受的,但尚未进行基准测试。
非常快
当连接到disas-bench时,yaxpeax_x86::long_mode的解码吞吐量约为250MB/s,在某些硬件上是最快的软件x86解码器。解码器中可能经过的路径,即通过`
尽管有一个仓库内基准测试,但我认为它过于不切实际,因此选择使用disas-bench,直到它提供更多信息。
非常小?
yaxpeax_x86::long_mode自带的代码和数据大小约为143KB。加上指令格式化的数据,增长到249KB。虽然代码大小可以缩小一些,但该crate的大部分是几个查找表——通过`
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