Appearance
题目
假定下列指令已装入指令寄存器,则执行时不可能导致 CPU 从用户态变为内核态(系统态)的是( )。
错因
A
被"DIV 是普通算术指令"的直觉骗了,没意识到它能触发 除零异常——一旦 R1 = 0,CPU 立即陷入异常处理(属于内中断),态切换到内核态。这是"普通指令也可能触发态切换"的典型例子。题问"不可能",A 是有可能切换的,看错了"不可能"两字就排除了它。
B
INT n 是软中断指令,专门用来主动陷入内核态(早期 syscall 就是这么实现的)。它的执行 100% 触发态切换,没法成为答案。误选 B 多半是没看到题面"不可能"这个反向措辞——把"会切换"的当成答案了。
D
把"MOV 内存→寄存器"想成纯粹的数据搬运,忽略了它可能触发缺页。如果 addr 对应的页不在内存,访存触发缺页中断、CPU 进内核态调页。MOV 看起来无害,但访存路径上的任何一步都可能引出异常 → 态切换。
总解析
题问"不可能"导致态切换。先把可能触发态切换的事件梳理:
| 触发源 | 例子 | 是否可能态切换 |
|---|---|---|
| 软中断 / 陷入指令 | INT n / trap / syscall | 必然切换(用户主动陷入) |
| 算术异常(除零、溢出) | DIV R0, R1 当 R1 = 0 | 可能(异常发生时切换) |
| 访存异常(缺页、越界、保护错) | MOV 触发缺页 | 可能(缺页/异常时切换) |
| 纯寄存器运算(不访内存、无异常) | NOT R0、ADD R0, R1(同寄存器内) | 绝不切换 |
| 外部中断(时钟、I/O) | 与具体指令无关 | 异步发生,不算"指令导致" |
逐项核对:
- A
DIV R0, R1:当 R1 = 0 触发除零异常 → 切换 → 可能切换 ✗(不是答案) - B
INT n:软中断指令,主动陷入 → 必切换 ✗(不是答案) - C
NOT R0:纯寄存器位翻转,不访内存、不触发异常、不调系统调用 → 绝不切换 ✓ - D
MOV R0, addr:访存可能缺页 → 可能切换 ✗(不是答案)
题问"不可能",只有 C 没有任何路径能引出态切换。
速记:"指令是否可能态切换"看两条——① 它是不是主动陷入指令(trap/INT/syscall);② 它执行过程中是否可能触发异常(算术、访存)。两条都不沾的纯寄存器运算才"绝不切换"。
最终答案是 C。