RDPMC - 讀取效能監視計數器

操作碼

指令

說明

0F 33

RDPMC

將 ECX 指定的效能監視計數器讀入 EDX:EAX

說明

將 ECX 暫存器指定的 40 位效能監視計數器載入到暫存器 EDX:EAX。EDX 暫存器中載入計數器的高 8 位,EAX 暫存器中載入低 32 位。奔騰(R) Pro 處理器有兩個效能監視計數器(0 與 1),它們分別通過在 ECX 暫存器中放入 0000H 或 0001H 進行指定。

奔騰 4 處理器支援通過 RDPMC 指令“快速”與“慢速”讀取效能監視計數器。如果 ECX 的位 31 設定為 1,則導致 RDPMC 指令讀取地址為 ECX[31:0] 的效能監視計數器中的低 32 位。32 位計數器結果將返回給 EAX,EDX 則設定為零。在奔騰 4 處理器上,讀取 32 位的執行速度比讀取完整的 40 位更快。如果清除 ECX 的位 31,則 RDPMC 將讀取地址為 ECX[30:0] 的效能監視計數器中完整的 40 位,並將數據返回給 EDX:EAX。

如果設定 CR4 暫存器中的 PCE 標誌,則 RDPMC 指令允許應用程式程式碼在特權級別 1、2 或 3 執行,以讀取效能監視計數器。提供此指令是爲了能夠通過應用程式程式碼進行效能監視,從而規避呼叫操作系統過程帶來的開銷。

效能監視計數器是事件計數器,可以程式設計為統計事件的數量,如解碼的指令數、收到的中斷數或快取載入數。在“IA-32 英特爾(R) 體系結構軟件開發人員手冊”第 3 卷附錄 A“效能監視計數器”中,列出可以統計的所有事件。

RDPMC 指令不序列化指令執行。也就是說,它並不暗示前面的指令導致的所有事件都已完成,也不暗示後面的指令導致的事件尚未開始。如果希望獲取確切的事件計數,軟體在執行 RDPCM 指令之前與/或之後,必須使用序列化指令(如 CPUID 指令)。

RDPMC 指令可以在 16 位定址模式或虛 8086 模式中執行;不過,此時仍然使用 ECX 暫存器的完整內容來確定要訪問的計數器,並且會返回完整的 40 位結果(低 32 位返回給 EAX 暫存器,高 9 位返回給 EDX 暫存器)。

英特爾(R) 體系結構相容性

RDPMC 指令在“英特爾(R) 體系結構”的奔騰 Pro 處理器以及含 MMX™ 技術的奔騰處理器中引入。其它奔騰處理器也有效能監視計數器,但是它們必須使用 RDMSR 指令讀取。

操作

IF (ECX 0 OR 1) AND ((CR4.PCE 1) OR ((CR4.PCE 0) AND (CPL=0)))
THEN
EDX:EAX PMC[ECX];
ELSE (* ECX is not 0 or 1 and/or CR4.PCE is 0 and CPL is 1, 2, or 3 *)
#GP(0); FI;

影響的標誌

無。

保護模式異常

#GP(0) - 如果目前特權級別不為 0,並且 CR4 暫存器中的 PCE 標誌被清除。如果 ECX 暫存器中的值不是 0 或 1。

實地址模式異常

#GP - 如果 CR4 暫存器中的 PCE 標誌被清除。如果 ECX 暫存器中的值不是 0 或 1。

虛 8086 模式異常

#GP(0) - 如果 CR4 暫存器中的 PCE 標誌被清除。如果 ECX 暫存器中的值不是 0 或 1。