Appearance
题目
某进程的段表内容如下所示。
| 段号 | 段长 | 内存起始地址 | 权限 | 状态 |
|---|---|---|---|---|
| 0 | 100 | 6000 | 只读 | 在内存 |
| 1 | 200 | · · · | 读写 | 不在内存 |
| 2 | 300 | 4000 | 读写 | 在内存 |
当访问段号为 2、段内地址为 400 的逻辑地址时,进行地址转换的结果是( )
错因
A
把段 2 误以为不在内存——但段表里段 2 的状态明确是"在内存",不会触发段缺失。也许看错了段号、看成段 1(不在内存)的情况,但题面访问的是段 2 不是段 1。
B
直接做了地址加法 4000 + 400 = 4400,跳过了越界检查这一步。分段地址转换的标准流程是:先查段长 → 再算物理地址。段 2 段长 300,访问 400 已经超出段范围,根本不该走到地址加法这一步。直接拼地址会让被访问的内存其实是段 2 之外的区域,OS 必须拦下来。
C
注意到了"权限"这一列,但越权(permission denied)指操作类型和权限设置冲突——比如对只读段写入。本题段 2 是读写权限,访问类型也没明确说是写,光从访问"段号 2、段内 400"看不出越权。误把"看到权限列"当成"应该是越权"的提示。
总解析
分段地址转换的完整步骤:
逻辑地址 (段号 s, 段内偏移 d)
↓
① 查段表第 s 项
② 检查段表项是否有效(在内存)→ 否则段缺失
③ 检查 d < 段长 → 否则越界
④ 检查权限 → 否则越权
⑤ 物理地址 = 段起始地址 + d逐步走查段号 2、段内地址 400:
| 步骤 | 检查 | 结果 |
|---|---|---|
| ① 查段表项 | 段 2:段长 300、起址 4000、读写、在内存 | OK |
| ② 在内存 | 状态"在内存" | 通过 |
| ③ 越界检查 | 越界! ❌ | |
| ④ 权限 | (前一步已失败,到不了这步) | — |
| ⑤ 算地址 | (到不了这步) | — |
第 ③ 步直接拦下——段内偏移 400 超过段长 300,触发越界异常。
优先级:段缺失(段在不在内存)→ 越界(偏移合不合法)→ 越权(操作权限)——按这个顺序检查,第一个失败就报对应异常。本题段 2 在内存(不缺失),偏移超长就先撞越界,到不了越权检查。
最终答案是 D。