RDTSCP
读取时间戳计数器和处理器ID
stableVMJITAOTinstruction
编码
| 操作码 | 指令 | Op/En | 64 位 | 兼容/传统 | 说明 |
|---|---|---|---|---|---|
0F 01 F9 | RDTSCP | ZO | 有效 | 有效 | 将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的软件:
- 如果软件要求 RDTSCP 只有在所有之前的店铺都在全球可见后才能执行,则可以执行
MFENCE 就在RDTSCP之前.
- 如果软件要求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.
- 联合国 当确定要装载的值时,负载被认为是全球可见的.
异常
保护模式
#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 位模式
| 与保护模式中的例外相同. |