说明
本文介绍x86平台(大部分是CPU)的一些高级功能。
介绍功能的模式大致是先说明功能的基本概述,然后介绍从哪代CPU开始引入,如何判断是否支持,以及如何使能该功能。
鉴于能力和篇幅有限,介绍的不会非常的详细,所以本文还会提供参考的文档。
下文中老是提到的《Intel软件开发者手册》可以在https://software.intel.com/en-us/articles/intel-sdm下载到。
Intel Virtualization Technology
虚拟化的作用是在一个平台上模拟出多个独立的平台系统供软件使用。
x86平台支持的虚拟化有如下的几种:
VT-x ——面向 IA-32 架构的英特尔® 虚拟化技术,为 IA-32 增加了两种全新的 CPU 操作模式:VMX 根操作和 VMX 非根操作。VMX 根操作设计用于 VMM,其运行方式非常类似于没有 VT-x 的 IA-32。VMX 非根操作可提供 VMM 控制,且用于支持虚拟机的其它 IA-32 环境。这两种操作模式均可支持全部 4 种优先级水平,支持客户机的软件以适当的优先级水平运行,并为 VMM 提供运行多种优先级水平的灵活性。通过 VT-x,客户机软件与 VMM 之间的每次转换都可改变线性地址空间,从而支持客户机软件充分利用其自己的地址空间。VMX 转换由 VMCS 进行管理,它驻留在物理地址空间中,而且不是线性地址空间中。
VT-i ——面向安腾架构的英特尔® 虚拟化技术,可为 VMM 提供客户机软件不能使用的虚拟地址位。VMM 可通过将客户呼叫截取到 PAL 流程(报告所部署的虚拟地址位数量),从而隐藏对该地址位的硬件支持。这样,客户机将不会期望使用这一最高位,硬件也不允许它使用,从而为 VMM 提供单独使用一半虚拟地址空间的“特权”。通过 VT-i,VMM 可以使用虚拟处理器描述符(VPD)中的虚拟化加速字段来表示客户机软件能够读取或写入中断控制寄存器,而且不需要调用每次存取的 VMM。VMM 可在发出任何虚拟中断前建立这些寄存器的数值,并且可以在客户机中断处理程序返回前对其进行修改。
VT-d ——面向 Directed I/O 的英特尔® 虚拟化技术,是接下来通往英特尔平台虚拟化全面硬件支持的关键一步。VT-d 扩展了英特尔® 虚拟化技术的发展蓝图,从目前支持 IA-32(VT-x)和英特尔® 安腾® 处理器(VT-i)虚拟化,到对 I/O 设备虚拟化的全新支持。VT-d 能够满足使用虚拟机(VM)技术的两项主要要求。首先,保护从虚拟机访问 I/O 资源不会干扰同一平台上另一台虚拟机的正常运行。VM 之间的相互隔离是实现可用性、可靠性和相互信任的基础。其次,虚拟平台必须提供在多台虚拟机之间共享 I/O 资源的能力。为每台虚拟机复制存储或网络控制器等 I/O 资源既不实用也不经济高效。VT-d I/O 设备虚拟化可以解决上述问题。
上面这一段是从Intel官网摘出来的。
简单来说,VT-x是对CPU的虚拟化;VT-d是对外设(一般是PCIE的外设,也称为SRIOV)虚拟化;VT-i是安腾的架构下的虚拟化,不是很熟......
VT-x
VT-x简单来说就是将一个CPU模拟成多个独立的CPU给软件使用。
VT-x将平台分为两个部分,一个是VMM(Virtual Machine Monitor),另一个是VM(Virtual Machine):
上图的Guest x就是VM。VM Exit,VMXON和VMXOFF等是操作虚拟化的命令。
VT-x在x86平台也称为VMX,全称Virtual Machine Extensions,在《Intel软件开发者手册》中第三卷中有大量的篇幅介绍。
最早Intel在奔腾4处理器中引入虚拟化技术:
为了使能VT-x需要对如下寄存器进行操作(还是IA32_FEATURE_CONTROL):
说明如下:
这里有说到SMX,它的全称是Safer Mode Extensions,它其实是TXT(后面会介绍)的一部分,为TXT提供了编程接口来进入更安全的Measured Launched Environment (MLE)。
因为TXT可以为VMX提供更安全的执行环境,所以这里分了IN和OUT SMX下的VMX。
SMX提供的编程接口在《Intel软件开发者手册》的第2卷中有详细的介绍。
VT-d
VT-d是对设备的模拟,就是将一个设备模拟成多个设备供软件使用。
为了完成设备的虚拟化,需要完成如下的部分:
为了完成上述的内容,引入了一个称为Domain的概念,它最终化为一张张的映射表放到VMM中,来形成对应。
Security Technology
虚拟化其实也是Intel安全技术的一种,因为它提供了隔离的系统环境,在这里就不介绍了。
TXT
TXT全称Trusted Execution Technology。
关于TXT,Intel有如下的说法:
简单来说就是Intel提供了一套软硬件结合的机制,用来提高系统的安全性。
下图是构成完成TXT支持的组件:
虚拟化其实不是TXT的必要条件,只是TXT也可以在虚拟化中使用(后面讲虚拟化的时候还会涉及到TXT)。
TPM是一个独立的芯片,TXT功能依赖于该模块来提供安全的加解密等操作。
TXT在Intel Xeon 5600系列处理器中首次引入。
关于TXT的详细介绍,可以在如下网站找到:
CPU要使能TXT功能,需要通过IA32_FEATURE_CONTROL这个MSR寄存器来使能:
SGX
SGX全称是Software Guard Extensions。Intel支持SGX的CPU提供了一种特定的访问内存的方式(称为Enclave)和一组指令,用来提供更加安全的方式来保护应用的代码和数据,如下图所示:
Intel提供了一个SDK用来编写有Enclave的应用程序,关于SGX的详细介绍可以在https://software.intel.com/zh-cn/sgx找到。
SGX是在SKYLAKE型号CPU中首次引入的:
SGX同样是一个需要在BIOS下使能的功能,如下面的寄存器所示(还是IA32_FEATURE_CONTROL):
关于SGX的完整说明可以在《Intel软件开发者手册》卷3中找到。
Power and Performance Technology
在x86平台中,能耗和性能是两个不可分割的部分,Intel提供了很多的技术来满足不同的能耗和性能的需求。
Intel Multi-Core and Hyper-Threading Technology
这是两项相关的技术,前者指在一个CPU中包含多个物理核,后者是指一个物理核中包含若干个逻辑核。
我们常说的2核4线程就是指支持HT的CPU里面有2个物理核,每个物理核包含2个逻辑核,如下图所示:
Hyper-Threading技术在2002年的推出的奔腾4系列CPU中首次引入:
关于多核支持,是在Intel奔腾处理器Extreme版本(就是双核四线程)中首次引入的,那应该是在2005年:
关于MP和HT的初始化,可以参考《Intel软件开发者手册》卷3中的《MULTIPLE-PROCESSOR (MP) INITIALIZATION》章节。
关于MC和HT还有如下的说明:
1. 可以通过CPUID来确定支持的MC和HT特性:
2. 为了初始化支持MC和HT的CPU,需要将CPU中的核分为BSP(Boot Strap Processor)和AP(Application Processors),然后每个核会分配一个ACPI ID,通过它来区分各个核。
《Intel软件开发者手册》卷3还讲了很多的内容,感觉看着还是很乱,先这样吧。
Intel Turbo Boost Technology
Turbo Boost的作用是让CPU的核心(包括图形处理的核)能够在基准频率之上运行。当然这种调节是自动的,并且是智能的。
该技术是在2008年推出的Nehalem架构CPU中推出的:
目前最新的CoffeeLake CPU已经支持到第二代的Turbo Boost技术,主要是增强了多线程和单线程上的性能。
与Turbo Boost技术相关的有很多的MSR寄存器,比如(不同平台可能存在差异):
我们就是通过控制这些寄存器来控制Turbo Boost功能的。
Intel Streaming SIMD Extensions (SSE)
要了解这项技术首先需要了解SIMD的意义,它表示的是Single Instruction Mulit Data。
这个SIMD的概念是在Intel的MMX技术中引入的,它的重点在于相同时钟周期内能够处理的数据变多了,这样就能够提升CPU的性能。
SSE基础从MMX开始,又经历的SSE、SSE2、SSE3、SSE4等,CPU能够在相同周期内处理的数据越来越多。
以上技术都会代码新的指令和寄存器。
Intel Advanced Vector Extensions(AVX)
该功能提供CPU能够处理256比特矢量的能力。它引入了新的一组指令集和寄存器。
简单来说就是CPU的处理能力变强了,不仅是在整型的处理,在浮点的处理也是,这就在执行某些运算的时候提升了性能。
它算是对SSE的扩展。
已经经历了AVX、AVX2,AVX-512等几代。
Intel 64 Architechture x2APIC
x2APIC是x86平台处理中断的机制,它之前是xAPIC,再之前是Intel® 82489DX external APIC。
关于中断机制的基本历史如下:
可以看到平台默认使用的是xAPIC模式,x2APIC需要另外使能。
关于使能x2APIC,如下所示:
对应的MSR寄存器如下: