当 CPU 处于内核模式时,它能读写任何寄存器吗?还是有一些寄存器即使在内核模式下也是无法访问的?
wrmsr
(写入特定型号寄存器)需要内核模式。读取MSR的rdmsr
同样需要内核模式。因此,与用户空间可以自由使用的整数和向量寄存器(rax..rsi/r8..r15和xmm0..15)不同,存在只有内核才能修改的寄存器。
可能会有一些仅在系统管理模式下访问的特定型号寄存器(有时称为环-1)。我不知道,我还没有多看SMM。和/或与SGX相关的寄存器(用于“隔离区域”),再次我没有研究过。
可能还有一些只能用wrmsr
读取但无法写入的只读MSR。我不知道这是否是您的意思,或者您是否只计算通常被认为是保存/恢复上下文切换时的架构状态的寄存器,例如通用整数寄存器。所有这些寄存器都可以在任何模式下进行写入,甚至是段寄存器。
wrfsbase
等指令,可以直接读写FS和GS的基址。即使没有这个扩展,它们也可以通过MSR访问。在长模式下,其他段的基址都是固定的,为base=0 limit=-1。 - Peter Cordes