RDTSC

读取时间戳计数器

stableVMJITAOTinstruction

编码

操作码指令Op/En64 位兼容/传统说明
0F 31RDTSCZO有效有效将时间戳计数器读入EDX:EAX.

实测开销

正在从 arch-data 加载实测数据...

说明

将处理器时间戳计数器(一个64位的MSR)的当前值读入EDX:EAX登记册. EDX寄存器装入了MSR的高序32位,EAX寄存器装入了低序32位. (关于支持Intel 64架构的处理器,RAX和RDX各高序的32位被清除).

处理器单调递增每个时钟周期的时标计数器MSR,每当处理器重置时将其重置为0. 参见Intel(R)64和IA-32架构软件开发者手册第3B卷第20章中的"时间戳计数器",具体细节为时间戳计数器行为.

注册号CR4中的时间戳禁用(TSD)旗帜限制使用RDTSC指令如下. 当旗帜清晰时,RDTSC指令可以在任何特权级别执行;当旗帜设定时,指令只能在特权级别0执行.

时间戳计数器也可以使用RDMSR指令读取,执行时为特权级别0.

RDTSC指令不是序列化指令. 它不一定等到所有先前的指示都执行之后再读取计数器. 同样,在读取操作进行之前,随后的指示可能开始执行. 以下项目可指导寻求命令处决RDTSC的软件:

负载和存储在全球可见,它可以执行MFENCE的序列;LFENCE就在RDTSC之前.

内存访问,它可以在RDTSC之后立即执行序列LFENCE.

本指令由Pentium处理器引入.

请参看Intel(R)64和IA-32架构软件开发者手册第3C卷第27章中的"VMX非root操作中的改变指令行为",以了解VMX非root操作中此指令行为的更多信息.

行动

IF (CR4.TSD = 0) or (CPL = 0) or (CR0.PE = 0)
    THEN EDX:EAX := TimeStampCounter;
    ELSE (* CR4.TSD = 1 and (CPL = 1, 2, or 3) and CR0.PE = 1 *)
          #GP(0);

FI;

受影响的旗帜

None.

  1. 联合国 当确定要装载的值时,负载被认为是全球可见的.

异常

保护模式
#GP(0)如果注册CR4中的TSD旗被设定,CPL大于0.
#UD如果使用 LOCK 前缀 。
实地址模式
#UD如果使用 LOCK 前缀 。
虚拟 8086 模式
#GP(0)如果注册的TSD旗设置为CR4.
#UD如果使用 LOCK 前缀 。
兼容模式
与保护模式中的例外相同.
64 位模式
与保护模式中的例外相同.

来源