将寄存器文件保存和恢复到内存中需要特权指令吗?
Do saving and restoring register files into memory need privileged instruction?
我猜不会,因为用户进程应该能够保存和恢复它自己的寄存器(例如用户级线程)并且它不会损害任何其他进程和 OS。但是,在进行上下文切换时,为什么要先切换到内核态,然后再保存和恢复寄存器呢?我很困惑。有人能帮忙吗?谢谢!
这取决于所使用的处理器以及需要保存和恢复的寄存器列表。
否 → 典型的 save/restore 场景称为 setjmp/longjmp 不需要任何特殊的东西。您可以通过在您最喜欢的 C(++)
编译器提供的运行时库的源代码中研究它的实现来找到更多关于它的内部结构。
是 → 恢复control registers like CR0
on the x86 architecture绝对是特权操作,因为篡改寄存器可能会破坏所有安全保证,让恶意代码对系统造成很大伤害。
Intel® 64 and IA-32 Architectures Software Developer’s Manual 中的“5.9 特权指令”一章将以下寄存器(及其 save/restore 指令)列为特权寄存器:
LGDT
- 加载 GDT 寄存器。
LLDT
- 加载 LDT 寄存器。
LTR
- 加载任务寄存器。
LIDT
- 加载 IDT 寄存器。
MOV
(控制寄存器)- 加载和存储控制寄存器。
LMSW
- 加载机器状态字。
CLTS
- 清除寄存器 CR0 中的任务切换标志。
MOV
(调试寄存器)- 加载和存储调试寄存器。
RDMSR
- 读取特定型号的寄存器。
WRMSR
- 写入特定于模型的寄存器。
- ...
另请参阅:
- Stack Overflow: How to save the registers on x86_64 for an interrupt service routine?
我猜不会,因为用户进程应该能够保存和恢复它自己的寄存器(例如用户级线程)并且它不会损害任何其他进程和 OS。但是,在进行上下文切换时,为什么要先切换到内核态,然后再保存和恢复寄存器呢?我很困惑。有人能帮忙吗?谢谢!
这取决于所使用的处理器以及需要保存和恢复的寄存器列表。
否 → 典型的 save/restore 场景称为 setjmp/longjmp 不需要任何特殊的东西。您可以通过在您最喜欢的 C(++)
编译器提供的运行时库的源代码中研究它的实现来找到更多关于它的内部结构。
是 → 恢复control registers like CR0
on the x86 architecture绝对是特权操作,因为篡改寄存器可能会破坏所有安全保证,让恶意代码对系统造成很大伤害。
Intel® 64 and IA-32 Architectures Software Developer’s Manual 中的“5.9 特权指令”一章将以下寄存器(及其 save/restore 指令)列为特权寄存器:
LGDT
- 加载 GDT 寄存器。LLDT
- 加载 LDT 寄存器。LTR
- 加载任务寄存器。LIDT
- 加载 IDT 寄存器。MOV
(控制寄存器)- 加载和存储控制寄存器。LMSW
- 加载机器状态字。CLTS
- 清除寄存器 CR0 中的任务切换标志。MOV
(调试寄存器)- 加载和存储调试寄存器。RDMSR
- 读取特定型号的寄存器。WRMSR
- 写入特定于模型的寄存器。- ...
另请参阅:
- Stack Overflow: How to save the registers on x86_64 for an interrupt service routine?