Skip to content

2026年 408 计算机组成原理 第 21 题

计算机组成原理2026年选择题2分

题目

在 I/O 子系统中,驱动程序和中断服务程序直接控制外设与主机之间的输入/输出操作,这一过程需要使用一些特权指令。下列指令中,不属于特权指令的是( )。

错因

A

误以为 I/O 指令属于普通编程接口(C / Java 里的 read() write() 是大家都能用的)。但用户写的 read() 是系统调用,不是真正的 I/O 指令;硬件 I/O 指令(IN / OUT 这类)直接读写设备控制寄存器,必须在内核态执行——用户态下执行会触发异常。"用户能用 read"和"用户能直接发 I/O 指令"是两件事。

B

误以为关中断只是开关一个标志位、影响范围小。但关中断是非常危险的操作:一旦关掉中断,操作系统就失去了对 CPU 的强制夺回能力(时钟中断也响应不了),用户态进程若能关中断,可以独占 CPU 永远不让出。所以关中断必须是特权指令,只有内核能用。

C

误以为中断返回只是普通的"恢复现场"。但中断返回(IRET / RTI)会同时把 CPSR / 状态寄存器恢复到中断前——包括把 CPU 模式从内核态切回用户态、恢复中断使能位等。如果用户态能执行中断返回,可以伪造一个"假装从内核返回"的状态,把自己 PSW 改成内核态——直接特权升级。所以必须是特权指令。

总解析

特权指令 vs 非特权指令 的判据:

一条指令是否能威胁系统安全 / 让操作系统失去控制?能 → 必须是特权指令,只能在内核态执行。

特权指令的几大类(必须内核态):

类别例子特权原因
直接操作硬件I/O 指令(IN / OUT)、读写控制寄存器绕过内核可破坏共享设备
改变 CPU 状态切换 CPU 模式、装载页表、清空 TLB改了状态可特权升级
中断管理开 / 关中断、设置中断向量、中断返回(IRET)关中断或假返回可绕过抢占调度
进程 / 内存隔离修改段表 / 页表寄存器、加载 PSW越界访问其他进程
停机指令HLT用户态停机会瘫痪整机

非特权指令(用户态可用):

  • 算术 / 逻辑运算(ADD、SUB、AND)
  • 数据传送(MOV、LOAD、STORE,通过虚地址
  • 控制流(JMP、CALL、RET、条件跳转)
  • 系统调用指令(SYSCALL / TRAP / INT)

为什么系统调用指令不是特权指令

系统调用指令的目的恰恰是"让用户态程序主动陷入内核"——用户写 read() 库函数最终编译成 SYSCALL 指令,这条指令本身必须能在用户态执行,否则用户根本进不了内核,整个系统调用机制就崩了。

它与特权指令的关系:

用户态 ──── SYSCALL(非特权,从用户态执行)─────▶ 进入内核态

                                                     ├─ I/O 指令(特权)
                                                     ├─ 关中断(特权)
                                                     ├─ 中断返回(特权)

                                                     └─ IRET ───▶ 返回用户态

陷入内核之后,CPU 自动切换到内核态,此时才能执行特权指令。SYSCALL 是"陷入"动作,不是"特权"操作——区别在于"它是允许从用户态发起的、安全的入口"。

逐项判断

选项类别是否特权
A. I/O 指令直接读写设备✓ 特权
B. 关中断指令中断管理✓ 特权
C. 中断返回指令中断管理(含模式切换)✓ 特权
D. 系统调用指令用户主动陷入入口✗ 非特权

最终答案是 D

易混淆抓手

"用户能用的接口(系统调用)"和"内核才能用的指令(特权指令)"是接力关系:用户态发起 SYSCALL(非特权)→ 陷入内核 → 内核里执行特权指令 → IRET 返回用户态。SYSCALL 是入口、不是特权操作。

最后更新:

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