1 名称
OPENSSL_ia32cap:x86[_64]架构处理器能力向量(processor capabilities vector)
2 概要
env OPENSSL_ia32cap=... <application>
3 描述
OpenSSL支持一系列的x86[_64]指令集扩展。在以EAX=1作为输入值运行CPUID指令之后,这些扩展由处理器返回的位于EDX:ECX寄存器对能力向量的各个位表示(详情可参考Intel Application Note #241618)。这些向量在工具包初始化时被复制到内存中,被用来选择不同的代码路径以在一系列处理器之间提供最佳性能。在撰写本文时,以下位很重要:
- 第4位:表示时间戳计数器(Time-Stamp Counter)的存在;
- 第19位:表示CLFLUSH(flush cache line缓存线清除操作码指令)指令可用;
- 第20位:由Intel保留,用于在RC4代码路径中进行选择;
- 第23位:表示MMX(Multi Media eXtension,多媒体扩展指令集)支持;
- 第24位:FXSR(FidelityFX™ Super Resolution)位,表示支持XMM寄存器;
- 第25位:表示支持SSE(streaming simd extensions流式单指令多数据扩展);
- 第26位:表示支持SSE2;
- 第28位:支持超线程(Hyperthreading),用于区分具有共享缓存的核心;
- 第30位:由 Intel 保留,特指 Intel CPU;
- 第33位:表明可以使用PCLMULQDQ(Carry-Less Multiplication Quadword,是对两个GF(2^128)域上的多项式相乘)指令;
- 第41位:表明支持SSSE3和补充SSE3;
- 第43位:表明支持AMD XOP(非AMD cpu上强制设置为0);
- 第54位:表明支持MOVBE(复制源操作数的数据,交换字节后,移动数据)指令;
- 第57位:表明支持AES-NI指令集(高级加密标准指令集,或称英特尔高级加密标准新指令,目的是改进应用程序使用高级加密标准(AES)执行加密和解密的速度)扩展;
- 第58位:XSAVE位,缺少该位与MOVBE结合用于识别Atom Silvermont 核心;
- 第59位:OSXSAVE位,表明支持YMM寄存器;
- 第60位:表明支持AVX(X86指令集的SSE延伸架构)扩展;
- 第62位:表明支持RDRAND(用于从芯片上的硬件随机数生成器中获取随机数)指令;
例如,在32位应用程序上下文环境中将第26位清0,则在运行时会禁用crypto库里的高性能SSE2代码,将第24位清0将会禁用SSE2代码操作128位MMX寄存器组。如果目标OpenSSL应用程序运行在SSE2兼容的cpu上,但是操作系统却没有启用XMM寄存器,则必须执行后者将第24位清0。一般情况下,功能向量的地址通过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汇编器模块中。
通过以EAX=7和ECX=0作为输入值获取CPUID返回的EBX数值,功能向量可以进一步扩展。下面的位很重要:
- 第64+3位:表明支持BMI1(Bit Manipulation Instructions位操作指令)指令,例如ANDN(第一源操作数取反后与第二源操作数按位与操作,结果保存在目标操作数中);
- 第64+5位:表明支持AVX2指令;
- 第64+8位:表明支持BMI2指令,如MULX和RORX;
- 第64+16位:表明支持AVX512F扩展;
- 第64+17位:表明支持AVX512DQ扩展;
- 第64+18位:表明支持RDSEED指令;
- 第64+19位:表明支持ADCX和ADOX指令;
- 第64+21位:表明支持VPMADD52[LH]UQ指令,又名AVX512IFMA扩展;
- 第64+29位:表明支持SHA扩展;
- 第64+30位:表明支持AVX512BW扩展;
- 第64+31位:表明支持AVX512VL扩展;
- 第64+41位:表明支持VAES扩展;
- 第64+42位:表明支持VPCLMULQDQ扩展;
要控制此扩展功能,请在设置OPENSSL_ia32cap环境变量时使用:作为分隔符。例如,分配:~0x20将禁用AVX2代码路径,而:0-禁用所有后AVX扩展。
4 返回值
不可用
原文地址:https://www.openssl.org/docs/man3.1/man3/OPENSSL_ia32cap.html