1. 程式人生 > >x86架構——x86上的那些不明覺厲的功能

x86架構——x86上的那些不明覺厲的功能

說明

本文介紹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的詳細介紹,可以在如下網站找到:

https://www.intel.com/content/www/us/en/architecture-and-technology/trusted-execution-technology/trusted-execution-technology-security-paper.html

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暫存器如下: