菜单

x86架构支持

相关源文件

本文深入概述了 Ghidra 对 x86 处理器架构系列的支持。它涵盖了寄存器集、寻址模式、指令变体以及各种 x86 指令集扩展(包括 AVX、AVX2 和 AVX-512)的实现。有关 ARM 架构支持的信息,请参阅ARM 架构支持

支持的 x86 变体

Ghidra 为整个 x86 架构系列提供全面支持,包括 16 位、32 位和 64 位变体。这些处理器变体在语言定义文件中定义。

来源:Ghidra/Processors/x86/data/languages/x86.ldefs4-120

每个变体都定义了特定的处理器规格和编译器支持。下表显示了每个变体可用的编译器支持

处理器变体支持的编译器
32 位 x86Visual Studio, Clang, GCC, Borland C++, Delphi, Go
16 位真实模式默认编译器规范
16 位保护模式默认编译器规范
64 位 x86Visual Studio, Clang, GCC, Go, Swift
64 位 (compat32)Visual Studio, GCC

来源:Ghidra/Processors/x86/data/languages/x86.ldefs14-119

寄存器定义

x86 架构包含多种寄存器,它们在不同的处理器世代中演变。Ghidra 建模了所有这些寄存器,并提供了精确的位级别规范,以支持对所有变体进行适当的分析。

通用寄存器

来源:Ghidra/Processors/x86/data/languages/ia.sinc17-37

段寄存器和特殊寄存器

x86 架构包含段寄存器和专用寄存器

来源:Ghidra/Processors/x86/data/languages/ia.sinc35-36 Ghidra/Processors/x86/data/languages/ia.sinc38-49 Ghidra/Processors/x86/data/languages/ia.sinc506-521

SIMD 寄存器

Ghidra 支持各种 x86 扩展的所有 SIMD 寄存器集

来源:Ghidra/Processors/x86/data/languages/ia.sinc92-127 Ghidra/Processors/x86/data/languages/ia.sinc155-364 Ghidra/Processors/x86/data/languages/ia.sinc371-373

指令集实现

Ghidra 的 x86 实现利用 Sleigh 语言定义处理器的指令集。该实现是模块化的,并组织成独立的文件,用于不同的指令集扩展。

核心实现结构

来源:Ghidra/Processors/x86/data/languages/x86.slaspec1-21 Ghidra/Processors/x86/data/languages/x86-64.slaspec1-7

指令解码

Ghidra 的 x86 实现采用全面的基于令牌的方法来解码复杂的指令集,该指令集具有可变长度编码和多个前缀。指令解码过程处理:

  1. 指令前缀(LOCK, REP, REPNE, 段覆盖)
  2. 64 位模式的 REX 前缀
  3. AVX/AVX2/AVX-512 的 VEX/EVEX 前缀
  4. 操作码字节
  5. ModR/M 和 SIB 字节
  6. 位移和立即数

来源:Ghidra/Processors/x86/data/languages/ia.sinc397-469 Ghidra/Processors/x86/data/languages/ia.sinc523-661

指令语义

指令语义使用 Ghidra 的中间表示 P-code 实现。为复杂的 x86 行为定义了特殊的 P-code 操作:

P-code 操作目的
segment根据段和偏移计算 RAM 地址
in/outI/O 端口操作
sysenter/sysexit系统调用操作
syscall/sysret64 位系统调用操作
LOCK/UNLOCK用于原子操作的内存锁定
XACQUIRE/XRELEASE事务性内存操作

来源:Ghidra/Processors/x86/data/languages/ia.sinc725-748

指令集扩展

x86-64 (AMD64/Intel 64)

64 位扩展增加了:

  • 64 位通用寄存器 (RAX-RDI, R8-R15)
  • 64 位寻址
  • 用于扩展寄存器集访问的 REX 前缀
  • 新指令模式和调用约定

来源:Ghidra/Processors/x86/data/languages/x86-64.slaspec1-7

SIMD 扩展

Ghidra 实现了多代 SIMD 扩展:

  1. MMX: 使用 MM0-MM7 寄存器的 64 位多媒体扩展
  2. SSE/SSE2/SSE3/SSSE3/SSE4: 使用 XMM0-XMM15 寄存器的 128 位扩展
  3. AVX/AVX2: 使用 YMM0-YMM15/31 寄存器的 256 位扩展
  4. AVX-512: 使用 ZMM0-ZMM31 寄存器和掩码寄存器 (K0-K7) 的 512 位扩展

实现细节因扩展而异

AVX 实现

AVX 指令使用 VEX 前缀编码并引入 256 位操作

来源:Ghidra/Processors/x86/data/languages/avx.sinc6-94 Ghidra/Processors/x86/data/languages/avx_manual.sinc1-33

AVX-512 实现

AVX-512 通过 EVEX 前缀扩展了 AVX,提供了对 512 位操作的支持,并增加了掩码功能

来源:Ghidra/Processors/x86/data/languages/avx512.sinc6-131 Ghidra/Processors/x86/data/languages/avx512_manual.sinc2-56

其他扩展

Ghidra 支持许多其他 x86 扩展:

扩展描述实现文件
BMI1位操作指令 1bmi1.sinc
BMI2位操作指令 2bmi2.sinc
FMA乘加融合fma.sinc
PCLMULQDQ无进位乘法pclmulqdq.sinc
LZCNT前导零计数lzcnt.sinc
RDRAND硬件随机数生成器rdrand.sinc
ADX多精度带进位加法adx.sinc
MPX内存保护扩展mpx.sinc
SGX软件防护扩展sgx.sinc
SMX更安全模式扩展smx.sinc

来源:Ghidra/Processors/x86/data/languages/x86.slaspec10-20 Ghidra/Processors/x86/certification.manifest9-76

内存寻址

Ghidra 实现了各种 x86 寻址模式,包括用于 16 位模式的段:偏移寻址和用于 32/64 位模式的复杂 ModR/M 和 SIB 字节组合。

来源:Ghidra/Processors/x86/data/languages/ia.sinc628-645

上下文和操作数大小处理

Ghidra 的 x86 实现处理 x86 指令复杂的上下文相关特性,包括:

  • 基于模式和前缀的操作数大小(16/32/64 位)
  • 基于模式和前缀的地址大小(16/32/64 位)
  • 用于 64 位模式扩展的 REX 前缀
  • 用于 AVX 指令的 VEX 和 EVEX 前缀解码

上下文寄存器存储影响指令解码的各种状态位

上下文位目的
longMode64 位模式指示符
addrsize16/32/64 位寻址模式
opsize16/32/64 位操作数大小
segover段覆盖
protectedMode保护模式指示符
vexModeVEX 指令模式
evexLEVEX 向量长度
evexZEVEX 归零/合并
evexBEVEX 广播/舍入
evexAAAEVEX 掩码寄存器

来源:Ghidra/Processors/x86/data/languages/ia.sinc367-470

原子操作的实现

Ghidra 通过 LOCK 前缀支持 x86 原子操作,该前缀作为特例实现。lockable.sinc 文件定义了可以带 LOCK 前缀的指令。

可锁定指令包括:

  • 算术指令 (ADD, ADC, SUB, SBB, INC, DEC, NEG)
  • 逻辑指令 (AND, OR, XOR, NOT)
  • 位操作 (BTC, BTR, BTS)
  • 比较并交换 (CMPXCHG, CMPXCHG8B, CMPXCHG16B)

来源:Ghidra/Processors/x86/data/languages/lockable.sinc1-6 Ghidra/Processors/x86/data/languages/lockable.sinc7-952

Sleigh 语言定义文件

x86 处理器模块由多个语言定义文件定义,这些文件指定 Ghidra 支持的处理器变体:

处理器变体ID描述
x86:LE:32:default32 位 Intel/AMD x86标准 32 位 x86
x86:LE:32:System Management Mode系统管理模式SMM 中的 32 位 x86
x86:LE:16:Real Mode16 位真实模式真实模式下的 x86
x86:LE:16:Protected Mode16 位保护模式16 位保护模式下的 x86
x86:LE:64:default64 位 Intel/AMD x86标准 64 位 x86-64
x86:LE:64:compat3264 位 compat32具有 32 位兼容性的 64 位模式

每个处理器变体都有相关的编译器规范,用于正确处理函数原型和调用约定。

来源:Ghidra/Processors/x86/data/languages/x86.ldefs1-121