Skip to content

2015年 408 操作系统 第 24 题

操作系统2015年选择题2分

题目

假定下列指令已装入指令寄存器,则执行时不可能导致 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

最后更新:

⚠️ 这道题暂未配可视化,欢迎在 CodeBrick 反馈区告诉我们你想看哪道题