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