Skip to content

2017年 408 操作系统 第 24 题

操作系统2017年选择题2分

题目

执行系统调用的过程包括如下主要操作:

① 返回用户态 ② 执行陷入(trap)指令 ③ 传递系统调用参数 ④ 执行相应的服务程序

正确的执行顺序是( )。

错因

A

把 ② 陷入排到了最前——好像觉得"先陷入内核才能传参"。但参数是用户态事先准备好的(放到约定的寄存器或栈上),陷入只是切换到内核态。先陷入再传参的顺序对参数的"用户态准备"环节交代不清。

B

② 陷入后直接 ④ 执行服务,再 ③ 传参——这等于内核已经在跑服务程序了才接到参数。但服务程序需要参数才能跑业务(read 没 fd 没 buf 怎么读?),先跑服务再传参逻辑上不通。

D

③ 传参 → ④ 执行服务 → ② 陷入 → ① 返回——"还没陷入就在执行内核服务程序"是矛盾的:执行内核代码必须先在内核态。④ 不可能在 ② 之前。

总解析

系统调用的标准流程:

用户态:
   ① 用户准备参数(按调用约定放到寄存器或栈)  ← ③ 传参
   ② 执行陷入指令(INT n / syscall)          ← ② 陷入
       ↓ CPU 切到内核态
内核态:
   ③ 内核读出系统调用号 + 参数
   ④ 跳转到对应服务程序执行                    ← ④ 执行服务
   ⑤ 服务结束,准备返回值

   ⑥ IRET 返回用户态                          ← ① 返回用户态
用户态:
   ⑦ 用户继续执行后续代码

按题面四步映射:

步骤在哪一态做时点
③ 传递参数用户态最先——陷入之前必须把参数准备好
② 执行陷入指令用户态发起,触发态切换第二——切到内核态
④ 执行服务程序内核态第三——服务程序消费参数干活
① 返回用户态跨态最后——服务完毕回用户态

正确顺序:③ → ② → ④ → ①

关键判定:态切换发生在 ② 之后——② 之前必须在用户态(准备参数),② 之后必须在内核态(执行服务),① 才回到用户态。这样逻辑自洽。

最终答案是 C

最后更新:

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