Appearance
题目
下列指令中,只能在内核态执行的是( )。
错因
A
把 trap 当成了"陷入内核"动作本身、误以为这条指令需要内核态权限。其实正好相反:trap 是用户态进程主动跨界进内核的入口,跟 int 0x80 / syscall 一样——执行 trap 的瞬间还在用户态,一旦执行才完成"用户态 → 内核态"的切换。如果它本身需要内核态才能用,应用程序就无法发起系统调用了。
C
被"数据传送"四个字吓住,觉得"动数据"听起来要特权。但 mov、load、store 这些就是 CPU 最基本的访问内存 / 寄存器指令,编译出来的用户程序里到处都是。它们不绕开 MMU,访问哪段内存仍受页表保护,所以即使在用户态执行也不会越权——根本不是特权指令。
D
把"调试用"误当成"内核才能用"。设置断点(如 x86 的 int 3 / 调试寄存器写入)通常分两种:① 软件断点 int 3 是普通中断指令,用户态可以随便插;② 调试寄存器 DR0-DR7 那种由 ring 0 控制——但题面笼统问"设置断点指令",主要指可以在用户态用的形式(gdb 调试用户程序就靠这个)。所以不是"只能内核态"的特权指令。
总解析
题问"只能在内核态执行"——也就是问哪条是特权指令。判定原则:会影响硬件全局状态、能绕开保护机制、能让一个进程影响另一个进程的指令,必须特权化。
| 指令 | 性质 | 在哪态执行 |
|---|---|---|
trap(陷入指令) | 用户态发起系统调用的入口 | 用户态执行,执行完才进内核 |
I/O 指令(in/out 等) | 直接读写设备控制器寄存器,影响硬件 | 只能内核态(特权指令) |
数据传送(mov/load/store) | 普通内存 / 寄存器访问 | 任意态 |
设置断点(如 int 3) | 调试用,调试器在用户态插进去就行 | 任意态(用户进程能用) |
I/O 指令一旦放给用户态,任何用户程序都能直接操作磁盘、网卡——OS 的设备保护就废了。所以从硬件设计上就把它锁在内核态,必须通过系统调用绕个弯让 OS 代理执行。
常见特权指令一览(顺手记):
- I/O 指令、停机指令(
hlt) - 修改 PSW、修改特权寄存器(CR0-CR4 等)
- 加载页表基址寄存器、刷 TLB
- 开 / 关中断、设置中断向量表
最终答案是 B。