在此紀錄R/W MSR的一些方式!!
在Assembly要去R/W CPU MSR Register是透過RDMSR & WRMSR這二個指令,而MSR是一個64 bit Register,要去R/W MSR需要透過下列格式:
ECX : Index register
MSR : EDX(High Dword) + EAX(Low Dword)
以讀取CPU倍頻(IA32_PERF_STS -- Performance Status Register)為例,下列為debug32去讀取IA32_PERF_STS的方式:
Mov ECX,0198hß198h為IA32_PERF_STS MSR Address
RDMSR
;
EAX就會秀出XXXXX613hß根據INTEL SPEC 6就是現在倍頻為6
如果要寫入CPU倍頻(IA32_PERF_CTL – Performance Control Register)為例,下列為debug32去寫入IA32_PERF_CTL的方式:
Mov ECX,0199hß199h為IA32_PERF_CTL MSR Address
Mov EDX,00000000hß high Dword 為0
Mov EAX, 0000000A 13hßlow Dword所寫入的A是BUS_RATIO_SEL是根
據INTEL SPEC
WRMSR
;
然後在用之前讀取MSR的方式去確認!!就可以知道是否有寫入的,不是每一個INTEL CPU都可以這樣寫入!!但是目前手上所使用的Core 2 DUO CPU是可以這樣寫入.
OS底下用RW去讀取IA32_PERF_STS的方式:
RDMSR 0x198
(IA32_PERF_STS MSR Address)
OS底下用RW去寫入IA32_PERF_CTL的方式
WRMSR 0x199 0ß high Dword 0xA13ßlow Dword
(IA32_PERF_CTL MSR Address)