RDTSC
读取时间戳计数器
stableVMJITAOTinstruction
编码
| 操作码 | 指令 | Op/En | 64 位 | 兼容/传统 | 说明 |
|---|---|---|---|---|---|
0F 31 | RDTSC | ZO | 有效 | 有效 | 将时间戳计数器读入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的软件:
- 如果软件要求RDTSC只有在之前的所有指令执行完毕并且所有之前的负载全局可见后才能执行,1它可以在RDTSC之前立即执行LFENCE.
- 如果软件要求 RDTSC 仅在所有先前指令执行完毕后执行
负载和存储在全球可见,它可以执行MFENCE的序列;LFENCE就在RDTSC之前.
- 如果软件要求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.
- 联合国 当确定要装载的值时,负载被认为是全球可见的.
异常
保护模式
#GP(0) | 如果注册CR4中的TSD旗被设定,CPL大于0. |
#UD | 如果使用 LOCK 前缀 。 |
实地址模式
#UD | 如果使用 LOCK 前缀 。 |
虚拟 8086 模式
#GP(0) | 如果注册的TSD旗设置为CR4. |
#UD | 如果使用 LOCK 前缀 。 |
兼容模式
| 与保护模式中的例外相同. |
64 位模式
| 与保护模式中的例外相同. |