当CPU处于内核模式时,它可以读写任何寄存器吗?

4
当 CPU 处于内核模式时,它能读写任何寄存器吗?还是有一些寄存器即使在内核模式下也是无法访问的?
1个回答

4
在x86上,没有分段寄存器,因此所有寄存器在架构上同时可见。
是的,在内核模式(ring 0)下,x86可以写入任何寄存器。(只要内核以64位模式运行,否则它无法访问x / ymm8..16或zmm8..31或r8..r15)。
是的,一个在从64位用户空间进入内核后切换到32位模式的内核是可能的;Solaris x86-64显然就是这样做的,而MacOS X曾经为了与32位内核驱动程序兼容而这样做。在RAM小于4GB且缓存较小的机器上,在内核中使用较小的指针具有一些好处,而缺点可能并不那么巨大。

wrmsr(写入特定型号寄存器)需要内核模式。读取MSR的rdmsr同样需要内核模式。因此,与用户空间可以自由使用的整数和向量寄存器(rax..rsi/r8..r15和xmm0..15)不同,存在只有内核才能修改的寄存器。

可能会有一些仅在系统管理模式下访问的特定型号寄存器(有时称为环-1)。我不知道,我还没有多看SMM。和/或与SGX相关的寄存器(用于“隔离区域”),再次我没有研究过。

可能还有一些只能用wrmsr读取但无法写入的只读MSR。我不知道这是否是您的意思,或者您是否只计算通常被认为是保存/恢复上下文切换时的架构状态的寄存器,例如通用整数寄存器。所有这些寄存器都可以在任何模式下进行写入,甚至是段寄存器。


内部段基址/限制寄存器不可直接读取,但在64位长模式下,它们的基址=0 / 限制=-1(除了FS和GS)。但是那些基址可以通过MSR_GS_BASE / MSR_FS_BASE上的rdmsr/wrmsr进行访问。FSGSBASE ISA扩展添加了wrfsbase等指令,这使您更直接地读取/写入FS和GS基址,比MSR更高效。 (无论哪种方式,内核都不必实际修改GDT或LDT条目并重新加载fs以更新线程本地存储的fs基址)。但我认为cs/ds/es/ss基址/限制没有通过MSRs公开,而这些对于32位保护模式很重要。(或者切换回实模式创建“非真实”模式)。

安全隔离区的事情怎么样? - fuz
@fuz:SGX 也有自己的寄存器吗?我从来没有真正研究过。但是很好的观点,我忘记提到了 SMM。 - Peter Cordes
1
一些无法直接读取或写入的其他寄存器是内部段基址和段限制寄存器。例如,这用于虚拟模式。 - fuz
@fuz:说得好,将它们描述为“寄存器”而不是“高速缓存”是准确的。FSGSBASE ISA扩展添加了wrfsbase等指令,可以直接读写FS和GS的基址。即使没有这个扩展,它们也可以通过MSR访问。在长模式下,其他段的基址都是固定的,为base=0 limit=-1。 - Peter Cordes
@fuz:我要睡觉了,如果你有其他想添加的内容,随意编辑。(当然,你也可以发布自己的答案。) - Peter Cordes
1
我不了解Solaris,但MacOS内核可以做到这一点。为什么32位内核可以运行64位二进制文件? - phuclv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接