OpenSSL

Cryptography and SSL/TLS Toolkit

OPENSSL_ia32cap

NAME

OPENSSL_ia32cap-x86 [_64]处理器功能向量

SYNOPSIS

 env OPENSSL_ia32cap=... <application>

DESCRIPTION

OpenSSL支持一系列x86 [_64]指令集扩展. 这些扩展由在执行EAX = 1输入值的CPUID指令后,由EDX:ECX寄存器对中的处理器返回的能力向量中的各个位表示(请参阅英特尔应用说明#241618). 该向量在工具箱初始化时复制到内存中,并用于在不同的代码路径之间进行选择,以在各种处理器上提供最佳性能. 在撰写本文时,以下几位很重要:

bit #4 denoting presence of Time-Stamp Counter.
bit #19 denoting availability of CLFLUSH instruction;
bit #20, reserved by Intel, is used to choose among RC4 code paths;
bit #23 denoting MMX support;
bit #24, FXSR bit, denoting availability of XMM registers;
bit #25 denoting SSE support;
bit #26 denoting SSE2 support;
bit #28 denoting Hyperthreading, which is used to distinguish cores with shared cache;
bit #30, reserved by Intel, denotes specifically Intel CPUs;
bit #33 denoting availability of PCLMULQDQ instruction;
bit #41 denoting SSSE3, Supplemental SSE3, support;
bit #43 denoting AMD XOP support (forced to zero on non-AMD CPUs);
bit #54 denoting availability of MOVBE instruction;
bit #57 denoting AES-NI instruction set extension;
bit #58, XSAVE bit, lack of which in combination with MOVBE is used to identify Atom Silvermont core;
bit #59, OSXSAVE bit, denoting availability of YMM registers;
bit #60 denoting AVX extension;
bit #62 denoting availability of RDRAND instruction;

例如,在32位应用程序上下文中,在运行时清除位#26将禁用密码库中存在的高性能SSE2代码,而清除位#24将禁用在128位XMM寄存器组上运行的SSE2代码. 如果在支持SSE2的CPU上执行目标OpenSSL应用程序,但在未启用XMM寄存器的OS的控制下,则可能必须执行后者. 历史上,功能向量副本的地址是通过OPENSSL_ia32cap_loc()公开给应用程序的,但现在不再. 现在,影响功能检测的唯一方法是在目标应用程序启动之前设置OPENSSL_ia32cap环境变量. 举一个具体的例子,在Intel P4处理器上'env OPENSSL_ia32cap = 0x16980010 apps / openssl'或更好的情况'env OPENSSL_ia32cap =〜0x1000000 apps / openssl'将达到预期的效果. 或者,您可以使用no-sse2选项重新配置工具包并重新编译.

不太直观的是清除"环境变量"项中的第28位或〜0x10000000. 事实是,它不是从CPUID输出中逐字复制的,而是经过调整以反映逻辑内核之间是否实际共享了数据缓存. 反过来,这会影响关于是否采用针对高速缓存定时攻击的昂贵对策的决策,尤其是在AES汇编器模块中.

通过使用CPUID返回的EBX值(EAX = 7和ECX = 0作为输入)进一步扩展功能向量. 以下几位很重要:

bit #64+3 denoting availability of BMI1 instructions, e.g. ANDN;
bit #64+5 denoting availability of AVX2 instructions;
bit #64+8 denoting availability of BMI2 instructions, e.g. MULX and RORX;
bit #64+16 denoting availability of AVX512F extension;
bit #64+18 denoting availability of RDSEED instruction;
bit #64+19 denoting availability of ADCX and ADOX instructions;
bit #64+29 denoting availability of SHA extension;
bit #64+30 denoting availability of AVX512BW extension;
bit #64+31 denoting availability of AVX512VL extension;

要控制此扩展功能字,请在设置OPENSSL_ia32cap环境变量时使用":"作为分隔符. 例如,分配':〜0x20'将禁用AVX2代码路径,而分配':0'-所有AVX后扩展名.

应该注意的是,实际上是否组装了一些最"花哨"的扩展代码路径,取决于当前的汇编程序版本. 始终汇编AES-NI / PCLMULQDQ,SSSE3和SHA扩展代码路径的基本最小值. 除此之外,下表总结了最低汇编程序版本要求:

   Extension   | GNU as | nasm   | llvm
   ------------+--------+--------+--------
   AVX         | 2.19   | 2.09   | 3.0
   AVX2        | 2.22   | 2.10   | 3.1
   AVX512      | 2.25   | 2.11.8 | 3.6

OPENSSL_ia32cap是一个宏,返回向量的第一个字.

版权所有2004-2016 The OpenSSL Project Authors. 版权所有.

根据OpenSSL许可("许可")获得许可. 除非遵守许可,否则您不得使用此文件. 您可以在源代码发行版的LICENSE文件中或在https://www.openssl.org/source/license.html上获取副本.

by  ICOPY.SITE