Appearance
题目
本地用户通过键盘登录系统时,首先获得键盘输入信息的程序是( )。
错因
A
shell(命令解释程序)在用户登录之后才启动,且按键时它早已运行——但它不是"首先获得"按键的程序。键盘扫描码先经过中断 → 内核驱动 → 缓冲队列,shell 通过 read 从输入队列里拿到字符,至少是第三个接触按键信息的环节。
C
系统调用服务程序是用户主动 read 时才被触发——但用户按键这件事是硬件主动发起的(按键 → 键盘控制器 → 中断),不是用户态主动 read 启动的事件链。把"事件流"的方向看反了。
D
用户登录程序(login)也是个用户进程——用户输入的字符经过一系列内核处理才到达它。它跟 shell 一样,也是通过 read 等待键盘数据,按键信息要先经过中断 ISR + 驱动队列,最后才到登录程序。
总解析
按键 → OS → 用户进程的完整事件链:
1. 用户按键
↓
2. 键盘控制器检测按键 → 产生扫描码 → 触发硬件中断(IRQ) ← 中断从这里开始
↓
3. CPU 响应中断 → 跳到中断处理程序 ← 第一个软件!
↓
4. 中断处理程序:
- 从键盘控制器读扫描码
- 翻译成 ASCII / Unicode
- 放入键盘输入缓冲队列
- 唤醒等待键盘的进程(如登录程序、shell)
↓
5. 等待按键的用户进程被唤醒,read 系统调用返回字符
↓
6. 用户进程(login → shell)处理字符首先获得按键信息的是中断处理程序——它是硬件中断后第一个执行的软件,从硬件那里直接拿扫描码,没有任何中间层。
| 程序 | 何时获得按键信息 | 顺序 |
|---|---|---|
| B 中断处理程序 | 硬件中断后立刻 | 第 1(首先) ✓ |
| C 系统调用服务程序 | 用户进程 read 时(更晚) | 第 2 |
| D 用户登录程序 | read 返回时 | 第 3 |
| A 命令解释程序 | 登录后 read 时 | 第 4(如果登录到 shell) |
关键判定:硬件主动发起的事件 → 中断处理程序最先接到。键盘按下是硬件触发的异步事件,唯一直接响应硬件信号的软件就是 ISR。
最终答案是 B。