1.介绍
MSR是CPU的一组64位寄存器,每个MSR都有它的地址值(如下图所示),可以分别通过RDMSR 和WRMSR 两条指令进行读和写的操作。
如图中为8个P-state寄存器,地址分别为0xC001 0064 ~ 0xC001 006B,每个寄存器64bit。
2.读取MSR
MSR的读取,使用rdmsr指令:
- 先向ECX寄存器,写入欲访问MSR地址;
- 再执行rdmsr指令;
- 寄存器数据(64位)被读取到EDX和EAX寄存器。
高32位放在EDX寄存器,低32位放在EAX寄存器。
mov ecx,176H // IA32_SYSENTER_EIP 寄存器的地址
rdmsr // 读MSR内容到 EDX:EAX 寄存器
3.写入MSR
MSR的写入,使用wrmsr指令:
- 先向ECX寄存器,写入欲访问MSR地址;
- 再向EDX和EAX寄存器,写入数据(64位);
- 最后执行wrmsr指令。
高32位放在EDX寄存器,低32位放在EAX寄存器。
mov rcx,176H
mov rdx,KERNEL_SERVICE_ENTRY
mov rax,rdx
shr rdx,32 ;拆分到EDX:EAX 放入 64 位的值
wrmsr