“Model Specific Registers”的版本间差异

来自osdev
跳到导航 跳到搜索
(创建页面,内容为“P6系列以后的处理器(包括PentiumPro、Pentium II、III、4和Intel Core)有一组寄存器,允许配置与操作系统相关的内容,如内存类型范围、syscenter/sysexit、本地APIC等。 可以使用RDMSR(读MSR)、WRMSR(写MSR)和RDTSC等特殊指令访问这些'''MSRs'''。 == 访问特定模型寄存器(Model Specific Registers) == RDMSR和WRMSR指令组访问的每个MSR都由一个32位整数标识。 MSR是64位宽的。 你…”)
 
 
第2行: 第2行:
可以使用RDMSR(读MSR)、WRMSR(写MSR)和RDTSC等特殊指令访问这些'''MSRs'''。
可以使用RDMSR(读MSR)、WRMSR(写MSR)和RDTSC等特殊指令访问这些'''MSRs'''。


== 访问特定模型寄存器(Model Specific Registers) ==
== 访问特定型号寄存器(Model Specific Registers) ==


RDMSR和WRMSR指令组访问的每个MSR都由一个32位整数标识。 MSR是64位宽的。 你的处理器上是否存在msr由 [[CPUID]] 指示。01h:EDX [位5]。
RDMSR和WRMSR指令组访问的每个MSR都由一个32位整数标识。 MSR是64位宽的。 你的处理器上是否存在msr由 [[CPUID]] 指示。01h:EDX [位5]。

2022年3月20日 (日) 14:24的最新版本

P6系列以后的处理器(包括PentiumPro、Pentium II、III、4和Intel Core)有一组寄存器,允许配置与操作系统相关的内容,如内存类型范围、syscenter/sysexit、本地APIC等。 可以使用RDMSR(读MSR)、WRMSR(写MSR)和RDTSC等特殊指令访问这些MSRs

访问特定型号寄存器(Model Specific Registers)

RDMSR和WRMSR指令组访问的每个MSR都由一个32位整数标识。 MSR是64位宽的。 你的处理器上是否存在msr由 CPUID 指示。01h:EDX [位5]。

const uint32_t CPUID_FLAG_MSR = 1 << 5;

bool cpuHasMSR()
{
   uint32_t a, d; // eax, edx
   cpuid(1, &a, &d);
   return d & CPUID_FLAG_MSR;
}

void cpuGetMSR(uint32_t msr, uint32_t *lo, uint32_t *hi)
{
   asm volatile("rdmsr" : "=a"(*lo), "=d"(*hi) : "c"(msr));
}

void cpuSetMSR(uint32_t msr, uint32_t lo, uint32_t hi)
{
   asm volatile("wrmsr" : : "a"(lo), "d"(hi), "c"(msr));
}

访问MSR的其他方式

rdmsr and wrmsr 是特权指令. 但是,有一些MSR可以使用特殊指令从非特权代码访问。 例如, rdtsc 指令是读取时间戳计数器的非特权指令,它实际上位于MSR(索引10h)中。

额外x86_64寄存器

AMD添加了 EFER寄存器,用于控制特定的长模式功能。 此后,它被英特尔采用。

Bit 0 System Call Extensions (SCE)
Bits 1-7 Reserved
Bit 8 Long Mode Enable (LME)
Bit 9 Reserved
Bit 10 Long Mode Active (LMA)
Bit 11 No-Execute Enable (NXE)
Bit 12 Secure Virtual Machine Enable (SVME)
Bit 13 Long Mode Segment Limit Enable (LMSLE)
Bit 14 fast FXSAVE/FXSTOR (FFXSR)
Bit 15 Translation Cache Extension (TCE)
Bits 16-63 Reserved

到目前为止,最有趣的是SCE位,因为它启用syscall指令。

另见

文章

外部链接

de:Model-Specific_Register