本文內容
虛擬機監控程序提供簡單的計時服務。它們基于常量速度參考時間源(一般x64系統上的ACPI計時器)。
提供以下計時器服務:
引用計數器
虛擬機監控程序維護每位分區引用時間計數器。其特點是,對它的連續訪問將返回嚴格單調降低(時間)值,如分區的任何和所有虛擬處理器所見到的那樣。據悉,參考計數器是速度常量,不受處理器或總線速率轉換或深度處理器電源節約狀態影響。創建分區時,分區的引用時間計數器初始化為零。所有分區的引用計數器的計數速度相同,但在任何時侯,它們的絕對值一般會有所不同,由于分區的創建時間不同。
只要起碼有一個虛擬處理器未顯式掛起,引用計數器將繼續計數。
分區引用計數器MSR
可以通過分區范圍的MSR訪問分區的引用計數器。
MSR地址注冊名稱說明
COUNT
分區范圍)(時間引用計數
創建分區時,MSR的值將設置為。虛擬處理器難以更改此值。任何寫入到它的嘗試就會造成#GP錯誤。
分區引用時間啟發
分區引用時間啟發將引用時間源呈現給不須要查獲虛擬機監控程序的分區。僅當基礎平臺支持固定處理器時間戳計數器(TSC)或iTSC時,此啟發才可用。在這種平臺上,處理器TSC頻度保持不變打點計時器的頻率,而不管處理器時鐘頻度因使用電源管理狀態(如ACPI處理器性能狀態、處理器空閑睡眠狀態(ACPIC狀態)等)而變化。
分區引用時間啟發使用虛擬TSC值、偏移量和因數,使來賓分區才能估算自分區創建以來的規范化引用時間(以100nS為單位)。該機制還容許來賓分區以原子方法估算將來賓分區遷移到具有不同TSC速度的平臺的引用時間,并提供回退機制來支持遷移到沒有固定速度TSC功能的平臺。
此設施不應用作時鐘時間的源,由于使用此設施估算的引用時間雖然在來賓分區保存期間停止,直至后續還原。
分區引用時間戳計數器頁
虛擬機監控程序提供一個分區范圍的虛擬引用TSC頁,該頁覆蓋在分區的GPA空間上。通過引用TSCMSR訪問分區的引用時間戳計數器頁。
參考TSC頁使用以下結構進行定義:
typedef struct
{
volatile UINT32 TscSequence;
UINT32 Reserved1;
volatile UINT64 TscScale;
volatile INT64 TscOffset;
UINT64 Reserved2[509];
} HV_REFERENCE_TSC_PAGE;
參考時間戳計數器(TSC)頁MSR
希望訪問其引用TSC頁面的來賓必須使用以下特定于模型的寄存器(MSR)。具有特權的分區可以訪問MSR。
MSR地址注冊名稱說明
_TSC
參考TSC頁
Bits說明屬性
63:12
GPA頁腳
讀/寫
11:1
應保留RsvdP(值)
讀/寫
啟用
讀/寫
在創建來賓分區時,引用TSCMSR的值。為此,默認情況下禁用引用TSC頁。來賓必須通過設置位0來啟用引用TSC頁。倘若指定的基址超出了分區的GPA空間的末尾,則來賓將難以訪問引用TSC頁。更改寄存器時,來賓應保留保留位的值(1到11),便于將來兼容。
分區引用TSC機制
分區引用時間按以下公式估算:
=((*)>>64)+
加法是64位除法,這會造成128位數字,之后往右聯通64次,以獲取高64位。
值用于跨遷移風波調整虛擬TSC值,以減輕從一個平臺到另一個平臺的TSC頻度變化。
若果在保存/還原或實時遷移期間縮放和/或偏斜數組發生修改,則值用于同步對啟發式引用時間的訪問。此數組充當序列號,每每更改刻度和/或偏斜量數組時,該序列號將遞增。0x0的特殊值用于指示此設施不再是引用時間的可靠源,VM必須回挪到其他源。
使用此啟發估算分區引用時間的建議代碼如下所示:
do
{
StartSequence = ReferenceTscPage->TscSequence;
if (StartSequence == 0)
{
// 0 means that the Reference TSC enlightenment is not available at
// the moment, and the Reference Time can only be obtained from
// reading the Reference Counter MSR.
ReferenceTime = rdmsr(HV_X64_MSR_TIME_REF_COUNT);
return ReferenceTime;
}
Tsc = rdtsc();
// Assigning Scale and Offset should neither happen before
// setting StartSequence, nor after setting EndSequence.
Scale = ReferenceTscPage->TscScale;
Offset = ReferenceTscPage->TscOffset;
EndSequence = ReferenceTscPage->TscSequence;
} while (EndSequence != StartSequence);
// The result of the multiplication is treated as a 128-bit value.
ReferenceTime = ((Tsc * Scale) >> 64) + Offset;
return ReferenceTime;
合成計時器
合成計時器提供一種機制,用于在將來的某個指定時間后生成中斷。支持單次計時器和定期計時器。合成計時器將消息發送到指定的SynICSINTx,(合成中斷源在過期時),或斷定中斷,具體取決于其配置方法。
虛擬機監控程序保證計時器過期訊號永遠不會在過期時間之前傳遞。該訊號可能會在過期時間后的任何時間抵達。
定期計時器
虛擬機監控程序會嘗試定期向計時器發出訊號。并且,假如用于發出過期訊號的虛擬處理器不可用,則個別計時器過期時間可能會延后。虛擬處理器可能不可用,由于虛擬處理器(暫停,比如,在查獲處理)期間,或則虛擬機監控程序的計劃程序決定不應在邏輯處理器(上計劃虛擬處理器,比如,由于另一個虛擬處理器正在使用邏輯處理器,或則虛擬處理器已超出其配額)。
假如虛擬處理器在足夠長的時間內不可用,則可能會錯過完整的計時器周期。在這些情況下,虛擬機監控程序使用兩種技術之一。
第一種技術涉及計時器周期調節,實際上減短周期,直至計時器“趕上”。假如錯過了大量計時器訊號打點計時器的頻率,虛擬機監控程序可能難以使用周期調節進行補償。在這些情況下,可能會完全跳過個別計時器過期訊號。
對于標記為延后的計時器,虛擬機監控程序使用第二種方式來處理虛擬處理器長時間不可用的情況。在這些情況下,計時器訊號將延后到此虛擬處理器可用。假如它直至下一個計時器到期前不久才可用,則會完全跳過它。
計時器過期次序
合成計時器和虛擬化計時器在指定過期時間或接近其指定的過期時間生成中斷。因為硬件和其他計劃交互,中斷可能會延后。在任意一組計時器之間都不能進行排序。
直接合成計時器
“直接”合成計時器在計時器過期時斷定中斷,而不是將消息發送到SynIc合成中斷源。通過設置合成計時器配置MSR的“”字段,將合成計時器設置為“直接”模式。“”字段控制計時器過期時斷定的中斷向量。
合成計時器MSR
合成計時器是通過使用模型特定的寄存器(與每位虛擬處理器關聯的MSR)配置的。四個合成計時器中的每一個都有一對關聯的MSR。
MSR地址注冊名稱說明
ONFIG
合成計時器0的配置寄存器。
OUNT
合成計時器0的過期時間或時限。
ONFIG
合成計時器1的配置寄存器。
OUNT
合成計時器1的過期時間或時限。
ONFIG
合成計時器2的配置寄存器。
OUNT
合成計時器2的過期時間或時限。
ONFIG
合成計時器3的配置寄存器。
OUNT
合成計時器3的過期時間或時限。
合成計時器配置寄存器Bits說明屬性
63:20
RsvdZ(值應設置為零)
讀/寫
19:16
SINTx-合成中斷源
讀/寫
15:13
RsvdZ(值應設置為零)
讀/寫
12
直接模式-計時器過期時斷定和中斷。
讀/寫
11:4
-在直接模式下控制斷定中斷向量
讀/寫
-假如寫入相應的計數器隱式造成啟用計時器,則設置
讀/寫
延后-假如計時器為惰性,則設置
讀/寫
定期-假如計時器是定期的,則設置
讀/寫
已啟用-假如啟用了計時器,則設置
讀/寫
創建并重置虛擬處理器時,所有ONFIG(綜合計時器配置)寄存器的值都設置為。因而,默認情況下禁用所有合成計時器。
假如設置了,則向相應的計數寄存器寫入非零位將造成設置并激活計數器。否則,應在寫入相應的計數寄存器后設置以激活計數器。有關Count寄存器的信息,請參閱以下部份。
當一次性計時器過期時,它會手動標記為禁用。定期計時器保持啟用狀態,直至顯式禁用。
假如啟用了一次性操作,而且指定的計數在過去,它將立刻過期。
對于未處于直接模式)的已啟用計時器(,不容許將SINTx數組設置為零。假如嘗試,計時器將被標記為禁用(即立刻消除位0)。
寫入已啟用的計時器的配置寄存器可能會造成未定義的行為。諸如,僅將計時器從一次性修改為定期可能不會形成預期內容。在修改任何其他屬性之前,應仍然禁用計時器。
合成計時器計數寄存器Bits說明屬性
63:0
計數-一次性計時器的過期時間、定期計時器的持續時間
讀/寫
編程到Count寄存器中的值是一個以100毫秒為單位的時間值。將值零寫入計數寄存器將停止計數器,因而禁用計時器,這與配置寄存器中的設置無關。
請注意,容許Count寄存器換行。包裝不會影響計時器的行為,而不管任何計時器屬性。
對于一次性計時器,它表示絕對計時器過期時間。當分區的引用計數器等于或小于指定的計數值時,計時器將過期。
對于定期計時器,計數表示計時器的時間段。第一個時間段從啟用合成計時器時開始。
合成計時器過期消息
計時器過期消息在計時器風波觸發時發送。有關消息有效負載的定義,請參閱LOAD。
合成Time-計時器MSR
假如分區具有Regs特權,而且虛擬機監控程序功能標示CPUID葉中設置了EDX位23,則綜合Time-計時器MSR可用。來賓軟件可以編程合成的無休時計時器,以在指定時間量(以100ns為單位)執行后生成定期中斷。當中斷觸發時,VP助手頁中的數組將設置為TRUE。來賓軟件可能會將此數組重置為FALSE。與體系結構性能計數器不同,合成計時器永遠不會由虛擬機監控程序重置,并在中斷之間連續運行。向量==2發送NMI,其他向量發送固定中斷。
與來賓停止時累積時間的常規合成計時器不同,()處于空閑狀態,合成Time-計時器僅在來賓未停止時累積時間。
MSR地址注冊名稱說明
合成Time-計時器配置MSR
合成Time-計時器計數MSR
合成Time-計時器配置說明屬性
63:9
RsvdZ(值應設置為零)
讀/寫
已啟用
讀/寫
7:0
向量
讀/寫
合成Time-計時器計數說明屬性
63:0
定期中斷速度(以100ns為單位)
讀/寫