【发布时间】:2015-04-18 21:30:14
【问题描述】:
我猜不,因为用户进程应该能够保存和恢复自己的寄存器(例如用户级线程),并且不会损害任何其他进程和操作系统。但是,在进行上下文切换时,为什么要先切换到内核模式,然后再保存和恢复寄存器呢?我很困惑。有人可以帮忙吗?谢谢!
【问题讨论】:
标签: memory operating-system kernel cpu-registers
我猜不,因为用户进程应该能够保存和恢复自己的寄存器(例如用户级线程),并且不会损害任何其他进程和操作系统。但是,在进行上下文切换时,为什么要先切换到内核模式,然后再保存和恢复寄存器呢?我很困惑。有人可以帮忙吗?谢谢!
【问题讨论】:
标签: memory operating-system kernel cpu-registers
这取决于使用的处理器以及需要保存和恢复的寄存器列表。
否 → 被称为setjmp/longjmp 的典型保存/恢复方案不需要任何特殊操作。您可以通过研究它在运行时库的源代码中的实现来了解更多关于它的内部结构,该运行时库由您最喜欢的C(++) 编译器提供。
是 → 在x86 architecture 上恢复control registers 就像CR0 一样绝对是特权操作,因为篡改寄存器可能会破坏所有安全保证并让恶意代码对系统造成很大伤害.
Intel® 64 and IA-32 Architectures Software Developer’s Manual 中的“5.9 特权指令”一章将以下寄存器(及其保存/恢复指令)列为特权:
LGDT - 加载 GDT 寄存器。LLDT - 加载 LDT 寄存器。LTR - 加载任务寄存器。LIDT - 加载 IDT 寄存器。MOV(控制寄存器)- 加载和存储控制寄存器。LMSW - 加载机器状态字。CLTS - 清除寄存器 CR0 中的任务切换标志。MOV(调试寄存器)- 加载和存储调试寄存器。RDMSR - 读取特定于模型的寄存器。WRMSR - 写入特定于模型的寄存器。另见:
【讨论】: