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

Assembly 当CPU处于内核模式时,它能读写任何寄存器吗?,assembly,x86,Assembly,X86,当CPU处于内核模式时,它是否可以读取和写入任何寄存器,或者是否存在一些即使在内核模式下也无法访问的寄存器?在x86上,没有存储寄存器,因此所有寄存器在架构上同时可见 是的,在内核模式(环0)下,x86可以写入任何寄存器。(只要内核在64位模式下运行,否则它无法访问x/ymm8..16或zmm8..31或r8..r15) 是的,从64位用户空间进入内核后,可以切换到32位模式的内核;Solaris x86-64显然做到了这一点,并与32位内核驱动程序兼容。在内存小于4GB、缓存较小的机器上,在内

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

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

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

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


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

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

也可能有一些只读的MSR,你永远不能用
wrmsr
.IDK来写,如果这是你的意思,或者如果你只计算通常被认为是在上下文开关上保存/恢复的体系结构状态的一部分的寄存器,比如通用整数寄存器。所有这些寄存器都可以在任何m中写ode,偶数段REG


内部段基/限制寄存器不可直接读取,但在64位长模式下,除FS和GS外,它们固定在基=0/限制=-1。但这些基可以通过
rdmsr
/
wrmsr
上的
MSR\u GS\u base
/
MSR\u FS\u base
访问

添加了FSGSBASE ISA扩展等,使您能够更直接地读/写FS和GS基,比MSR更有效(无论哪种方式,内核都不需要实际修改GDT或LDT条目,并重新加载
FS
来更新线程本地存储的
FS
基)


但我不认为cs/ds/es/ss基本/限制是通过MSR公开的,它们与32位保护模式(或切换回真实模式以创建“不真实”模式)相关

关于安全enclave的东西呢?@fuz:SGX也有自己的寄存器吗?我从来没有真正研究过它。但好的一点,我忘了提到它以及SMM。其他一些不能直接读取或写入的寄存器是内部段基寄存器和段限制寄存器。例如,这用于非真实模式。@fuz:good重点是,将它们描述为“寄存器”而不是“缓存”是准确的。添加了FSGSBASE ISA扩展等,它允许您直接读/写FS和GS基。即使没有这些扩展,它们也可以通过MSR访问。在长模式下,其他段固定在base=0 limit=-1我不知道Solaris,但MacOS内核做到了这一点。