gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 00:13:29 25 4
gpt4 key购买 nike

当CPU处于内核态时,它可以读写任何寄存器,还是有一些寄存器即使在内核态下也无法访问?

最佳答案

在 x86 上,没有存储寄存器,因此所有寄存器在架构上同时可见。

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

是的,从 64 位用户空间进入内核后切换到 32 位模式的内核是可能的; Solaris x86-64 显然做到了这一点,MacOS X used to do this与 32 位内核驱动程序兼容。在内存小于 4GB 和缓存较小的机器上,在内核中使用较小的指针有一些好处,但缺点可能没有那么大。
wrmsr (Write Model-Specific Register) 需要内核模式。 rdmsr也是如此阅读 MSR。因此,与用户空间可以自由使用的整数和向量 regs(rax..rsi/r8..r15 和 xmm0..15)不同,有些寄存器只能由内核修改。

可能有一些特定于模型的 regs 只能在系统管理模式下访问。 (有时称为 ring -1)我不知道,我对 SMM 的了解不多。和/或与 SGX 相关的寄存器(用于“飞地”),我也没有研究过。

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

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

添加了 FSGSBASE ISA 扩展 wrfsbase 等等,它确实让你更直接地读/写 FS 和 GS 基础,比 MSR 更有效。 (无论哪种方式,内核都不必实际修改 GDT 或 LDT 条目并重新加载 fs 来更新线程本地存储的 fs 基础)。 Detail about MSR_GS_BASE in linux x86 64

但我不认为 cs/ds/es/ss 基础/限制是通过 MSR 公开的,而这些与 32 位保护模式相关。 (或者切换回真实模式以创建“虚幻”模式。)

关于assembly - 当 CPU 处于内核态时,它可以读写任何寄存器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55746156/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com