本文内容
虚拟机监控程序提供简单的计时服务。它们基于常量速度参考时间源(一般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为单位)
读/写