Appearance
题目
下列指令中,不能在用户态执行的是( )。
错因
A
把 trap 误以为是"陷入内核"所以"是特权指令"。其实正好相反——trap 的作用就是让用户态进程主动陷入内核态(系统调用就是这么实现的),它必须能在用户态执行,否则用户程序根本没办法发起 syscall。trap 是用户态可以执行的指令。
B
跳转指令(jmp/jne 之类的控制流指令)是程序最基础的操作——任何用户程序都要用 if/else、循环、函数调用,全靠这些实现。如果不能在用户态执行,用户程序就跑不起来。这是普通指令,跟特权完全无关。
C
压栈(push)是函数调用、保存上下文、临时变量都要用的基础操作。把它当特权指令不合理——用户程序栈帧操作是天天在做的事,必须能在用户态执行。
总解析
特权指令:只能在内核态执行的指令,硬件层面在用户态执行会触发"非法指令"异常。判断标准——这条指令是否会影响系统级状态、可能危害其他进程或整机稳定。
| 指令 | 作用 | 是否特权? |
|---|---|---|
| A trap | 用户主动陷入内核(syscall 入口) | ✗ 必须能在用户态发起,否则用户没法叫内核 |
| B 跳转 | 改 PC 寄存器,控制流转移 | ✗ 普通指令,每个用户程序都在用 |
| C 压栈 | 改栈指针,把数据存到栈上 | ✗ 普通指令,函数调用必备 |
| D 关中断 | 屏蔽 CPU 响应中断 | ✓ 特权 —— 用户态能关中断的话,恶意程序一关就让 OS 失去对 CPU 的控制(时钟中断、I/O 中断都进不来),等于霸占整机 |
判定原则:能让 OS 失去对硬件的"听觉"或控制权的指令,必须特权——典型如开/关中断、设置中断向量、I/O 指令、修改特权标志位、加载 PSW。
关中断如果允许在用户态执行,恶意进程一旦关掉中断 + 进入死循环,时钟中断进不来、调度器叫不醒它、OS 也救不回来,整机就被它锁死了。这是必须由内核独占的关键能力。
最终答案是 D。