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



当CPU处于内核模式时,它是否可以读写任何寄存器,或者是否存在一些即使在内核模式下也无法访问的寄存器?

在 x86 上,没有库寄存器,因此所有寄存器在体系结构上同时可见。

是的,在内核模式(环 0)下,x86 可以写入任何寄存器。 (只要内核在 64 位模式下运行,否则无法访问 x/ymm8。16 或 zmm8..31,或 r8..建议15)。

是的,从 32 位用户空间进入内核后切换到 64 位模式的内核是可能的;Solaris x86-64显然这样做了,MacOS X曾经这样做是为了与32位内核驱动程序兼容。 在 RAM 小于 4GB 且缓存较小的计算机上,在内核中使用较小的指针有一些好处,缺点可能没有那么大。


wrmsr(写入特定于模型的寄存器)需要内核模式。 阅读 MSR 的rdmsr也是如此。 所以不像整数和向量注册(rax..RSI/R8..R15 和 XMM0..15),其中用户空间可以自由使用,寄存器只有内核可以修改。

可能存在一些特定于模型的注册,只能在系统管理模式下访问。(有时称为环-1) 我不知道,我没有读过太多关于SMM的信息。 和/或与SGX相关的寄存器(用于"飞地"),我也没有研究过。

可能还有一些只读 MSR 永远无法使用wrmsr写入。 IDK,如果这就是你的意思,或者如果你只计算通常被认为是在上下文切换上保存/恢复的体系结构状态一部分的寄存器,如通用整数寄存器。 所有这些注册都可以在任何模式下写入,甚至是段注册。


内部段基数/限值寄存器不能直接读取,但在 64 位长模式下,除 FS 和 GS 外,它们固定在 base=0/limit=-1。 但是这些基地可以通过rdmsr/wrmsrMSR_GS_BASE/MSR_FS_BASE上访问.

FSGSBASE ISA扩展增加了wrfsbase等,这确实可以让您更直接地读取/写入FS和GS基础,比MSR更有效。 (无论哪种方式,内核都不必实际修改 GDT 或 LDT 条目并重新加载fs来更新线程本地存储的fs库)。 有关 linux x86 中MSR_GS_BASE的详细信息 64

但我不认为 cs/ds/es/ss base/limit 是通过 MSR 公开的,这些与 32 位保护模式相关。 (或者切换回真实模式以创建"虚幻"模式。

最新更新