Appearance
题目
下列关于系统调用的叙述中,正确的是( )。
Ⅰ. 在执行系统调用服务程序的过程中,CPU 处于内核态 Ⅱ. 操作系统通过提供系统调用避免用户程序直接访问外设 Ⅲ. 不同的操作系统为应用程序提供了统一的系统调用接口 Ⅳ. 系统调用是操作系统内核为应用程序提供服务的接口
错因
A
承认了 Ⅰ 和 Ⅳ 这种"教科书定义级"的命题,但漏掉了 Ⅱ。可能觉得"避免用户程序直接访问外设"是硬件层面(特权指令保护)做的,跟系统调用没关系——但保护机制和接口机制是配套的:硬件不让用户程序碰外设、OS 必须提供等价的合法通道让用户能用,这个通道就是系统调用。两者一起达成"用户不能直接 → 用户必须通过 syscall"。
B
只勾了 Ⅱ Ⅲ。Ⅱ 对,但 Ⅲ 是个明显的错——不同 OS 的 syscall 接口完全不一样:Linux 的 read()、Windows 的 ReadFile、macOS 的 BSD 风格调用号各不相同,连参数布局和错误返回方式都不同。误以为 syscall 像 ANSI C 一样跨 OS 统一,是把 POSIX C 库(部分 OS 实现的标准)和 syscall 本身混为一谈了。
D
承认 Ⅰ Ⅳ,又把 Ⅲ 也选上了——可能记成"POSIX 标准让 syscall 统一"。但 POSIX 是接口规范,且只有 Unix 家族部分遵守;Windows 的 Win32/NT 调用根本不在 POSIX 体系内。系统调用号、调用约定、参数语义都没有跨 OS 的统一标准,把 Ⅲ 选进去是常见误记。
总解析
四个命题逐条判:
| 命题 | 判定 | 说明 |
|---|---|---|
| Ⅰ 系统调用执行时 CPU 处于内核态 | ✓ | 用户态发起 syscall → 触发陷入指令(trap)→ CPU 切到内核态 → 执行内核代码 → 返回用户态。整个服务程序运行期间一直在内核态 |
| Ⅱ 通过 syscall 避免用户直接访问外设 | ✓ | 硬件特权机制禁止用户态执行 I/O 指令;OS 通过 syscall 提供受控接口,用户必须经此通道才能让 OS 代为访问外设 |
| Ⅲ 不同 OS 提供统一的 syscall 接口 | ✗ | Linux/Windows/macOS 的调用号、参数、约定都不同。POSIX 只是一种规范,且不是所有 OS 都遵循,Windows 完全是另一套 |
| Ⅳ syscall 是内核为应用提供服务的接口 | ✓ | 这是 syscall 的核心定义:用户态程序请求内核服务的唯一合法通道 |
正确的是 Ⅰ Ⅱ Ⅳ。
速记:syscall 三件事——陷入内核态、合法访问受保护资源、是 OS 为应用开的窗口;唯一别记的就是它不跨 OS 统一。
最终答案是 C。