当CPU处于内核模式时,它可以读写任何寄存器吗?或者是否有一些寄存器即使在内核模式下也无法访问?
在 x86 上,没有分组寄存器,因此所有寄存器在架构上同时可见。
是的,在内核模式(环 0)下,x86 可以写入任何寄存器。 (只要内核运行在64位模式下,否则无法访问x/ymm8..16或zmm8..31,或r8..r15)。
是的,从 64 位用户空间进入内核后切换到 32 位模式的内核是可能的; Solaris x86-64 显然是这样做的,并且MacOS X 曾经这样做过与 32 位内核驱动程序兼容。在 RAM 小于 4GB 且缓存较小的机器上,在内核中使用较小的指针有一些好处,而且缺点可能没有那么大。
wrmsr
(写入特定于型号的寄存器)requires内核模式。也是如此rdmsr
阅读 MSR。因此,与用户空间可以自由使用的整数和向量寄存器(rax..rsi/r8..r15 和 xmm0..15)不同,are只有内核可以修改的寄存器。
可能有一些特定于模型的注册表只能在系统管理模式下访问。 (有时称为环-1)我不知道,我没有读过太多关于SMM的内容。和/或与 SGX 相关的寄存器(用于“飞地”),我也没有研究过。
可能还存在一些您永远无法写入的只读 MSRwrmsr
。 IDK,如果这就是你的意思,或者如果你只计算通常被认为是在上下文切换时保存/恢复的架构状态的一部分的寄存器,例如通用整数寄存器。所有这些寄存器都可以在任何模式下写入,甚至是段寄存器。
内部段基址/限制寄存器不可直接读取,但在 64 位长模式下,除 FS 和 GS 外,它们固定为基址 = 0 / 限制 = -1。但这些基地可以通过rdmsr
/wrmsr
on MSR_GS_BASE
/ MSR_FS_BASE
.
添加了 FSGSBASE ISA 扩展wrfsbase等等,这确实可以让您更直接地读/写 FS 和 GS 库,比 MSR 更有效。 (无论哪种方式,内核都不必实际修改 GDT 或 LDT 条目并重新加载fs
更新fs
线程本地存储的基础)。Linux x86 64 中 MSR_GS_BASE 的详细信息
但我不认为 cs/ds/es/ss 基数/限制是通过 MSR 公开的,并且这些与 32 位保护模式相关。 (或者切换回真实模式以创建“虚幻”模式。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)