当CPU处于内核模式时,它是否可以读写任何寄存器,或者是否存在一些即使在内核模式下也无法访问的寄存器?
发布于 2019-04-18 20:41:42
在x86上,没有银行寄存器,所以所有的寄存器在架构上都是同时可见的。
是的,在内核模式(环0)下,x86可以写入任何寄存器。(只要内核在64位模式下运行,否则它就不能访问x/ymm8..16、zmm8..31或r8..r15)。
是的,从64位用户空间进入内核后切换到32位模式的内核是可能的;Solarisx86-64显然做到了这一点,而MacOS X used to do this则是为了与32位内核驱动程序兼容。在RAM小于4 4GB且缓存较小的机器上,在内核中使用较小的指针有一些好处,但缺点可能不是很大。
wrmsr (写入特定于模型的寄存器)需要内核模式。读取MSR的rdmsr也是如此。因此,与用户空间可以自由使用的整数和向量regs (rax..rsi/r8..r15和xmm0..15)不同,有些寄存器只能由内核修改。
可能存在一些特定于模型的regs,它们只能在系统管理模式下访问。(有时也叫ring -1)我不知道,我没读过多少关于SMM的书。和/或与SGX相关的寄存器(用于“enclaves”),这也是我没有研究过的。
也可能有一些您永远不能用wrmsr写入的只读MSR。IDK如果这就是您的意思,或者如果您只计算通常被认为是在上下文切换中保存/恢复的体系结构状态的一部分的寄存器,如通用整数寄存器。所有这些regs都可以在任何模式下写入,即使是段regs。
内部段基址/limit寄存器不能直接读取,但在64位长模式下,除FS和GS外,它们固定在base=0 / limit=-1。但这些库可以通过MSR_GS_BASE / MSR_FS_BASE上的rdmsr/wrmsr访问。
FSGSBASE ISA扩展添加了wrfsbase等,这确实让你可以更直接地读/写FS和GS库,比MSR更高效。(无论采用哪种方式,内核都不必实际修改GDT或LDT条目并重新加载fs来更新线程本地存储的fs库)。Detail about MSR_GS_BASE in linux x86 64
但我不认为cs/ds/es/ss base/limit是通过MSR公开的,而这些是与32位保护模式相关的。(或者用于切换回真实模式以创建“非真实”模式。)
https://stackoverflow.com/questions/55746156
复制相似问题