Appearance
题目
执行系统调用的过程包括如下主要操作:
① 返回用户态 ② 执行陷入(trap)指令 ③ 传递系统调用参数 ④ 执行相应的服务程序
正确的执行顺序是( )。
错因
A
把 ② 陷入排到了最前——好像觉得"先陷入内核才能传参"。但参数是用户态事先准备好的(放到约定的寄存器或栈上),陷入只是切换到内核态。先陷入再传参的顺序对参数的"用户态准备"环节交代不清。
B
② 陷入后直接 ④ 执行服务,再 ③ 传参——这等于内核已经在跑服务程序了才接到参数。但服务程序需要参数才能跑业务(read 没 fd 没 buf 怎么读?),先跑服务再传参逻辑上不通。
D
③ 传参 → ④ 执行服务 → ② 陷入 → ① 返回——"还没陷入就在执行内核服务程序"是矛盾的:执行内核代码必须先在内核态。④ 不可能在 ② 之前。
总解析
系统调用的标准流程:
用户态:
① 用户准备参数(按调用约定放到寄存器或栈) ← ③ 传参
② 执行陷入指令(INT n / syscall) ← ② 陷入
↓ CPU 切到内核态
内核态:
③ 内核读出系统调用号 + 参数
④ 跳转到对应服务程序执行 ← ④ 执行服务
⑤ 服务结束,准备返回值
↓
⑥ IRET 返回用户态 ← ① 返回用户态
用户态:
⑦ 用户继续执行后续代码按题面四步映射:
| 步骤 | 在哪一态做 | 时点 |
|---|---|---|
| ③ 传递参数 | 用户态 | 最先——陷入之前必须把参数准备好 |
| ② 执行陷入指令 | 用户态发起,触发态切换 | 第二——切到内核态 |
| ④ 执行服务程序 | 内核态 | 第三——服务程序消费参数干活 |
| ① 返回用户态 | 跨态 | 最后——服务完毕回用户态 |
正确顺序:③ → ② → ④ → ①。
关键判定:态切换发生在 ② 之后——② 之前必须在用户态(准备参数),② 之后必须在内核态(执行服务),① 才回到用户态。这样逻辑自洽。
最终答案是 C。