我猜不是因为用户进程应该能够保存和恢复自己的寄存器(例如用户级线程),并且它不会损害任何其他进程和操作系统。但是,在进行上下文切换时,为什么我们需要先更改为内核模式然后保存并恢复寄存器?我很困惑。有人可以帮忙吗?谢谢!
答案 0 :(得分:1)
取决于所使用的处理器以及需要保存和恢复的寄存器列表。
否→称为setjmp/longjmp的典型保存/恢复方案不需要任何特殊内容。您可以通过在您最喜欢的C(++)
编译器提供的运行时库的源代码中研究它的实现来找到有关它内部的更多信息。
是→在control registers上恢复x86 architecture CR0
肯定是特权操作,因为篡改注册可能会破坏所有安全保障并让恶意代码执行对系统造成很大的伤害。
章" 5.9特权指令"在Intel® 64 and IA-32 Architectures Software Developer’s Manual中,将以下寄存器(及其保存/恢复指令)列为特权:
LGDT
- 加载GDT注册。LLDT
- 加载LDT寄存器。LTR
- 加载任务注册。LIDT
- 加载IDT注册。MOV
(控制寄存器) - 加载和存储控制寄存器。LMSW
- 加载机器状态字。CLTS
- 清除CR0寄存器中的任务切换标志。MOV
(调试寄存器) - 加载和存储调试寄存器。RDMSR
- 阅读特定型号的注册表。WRMSR
- 编写特定于模型的注册表。另见: