RDTSCP

读取时间戳计数器和处理器ID

stableVMJITAOTinstruction

编码

操作码指令Op/En64 位兼容/传统说明
0F 01 F9RDTSCPZO有效有效将64位时标计数器和IA32 TSC AUX值读入EDX:EAX和ECX.

实测开销

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

说明

将处理器的时标计数器(一个64位的MSR)的当前值读入EDX:EAX的登记册,还将IA32 TSC AUX MSR(地址C0000103H)的值读入ECX的登记册. EDX寄存器装入IA32 TSC MSR的高序32位;EAX寄存器装入IA32 TSC MSR的低序32位;ECX寄存器装入IA32 TSC AUX MSR的低序32位. 在支持Intel 64架构的处理器上,RAX,RDX,和RCX的每个高序32位被清除.

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

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

RDTSCP指令不是一个序列化指令,但它确实等待所有先前指令执行完毕,所有之前的负载都在全球可见. 1但它并不等待以前的商店在全球可见,后续指令可能在执行读操作前开始执行. 以下项目可指导寻求命令处决RDTSCP的软件:

MFENCE 就在RDTSCP之前.

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

请参看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;
          ECX := IA32_TSC_AUX[31:0];
    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 前缀。如果 CPUID.80000001H: EDX.RDTSCP[27] = 0.
实地址模式
#UD如果使用 LOCK 前缀。如果 CPUID.80000001H: EDX.RDTSCP[27] = 0.
虚拟 8086 模式
#GP(0)如果注册的TSD旗设置为CR4.
#UD如果使用 LOCK 前缀。如果 CPUID.80000001H: EDX.RDTSCP[27] = 0.
兼容模式
与保护模式中的例外相同.
64 位模式
与保护模式中的例外相同.

来源