Skip to content

2016年 408 操作系统 第 28 题

操作系统2016年选择题2分

题目

某进程的段表内容如下所示。

段号段长内存起始地址权限状态
01006000只读在内存
1200· · ·读写不在内存
23004000读写在内存

当访问段号为 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

最后更新:

🎬 可视化演示
加载中...

提示:可在可视化区直接操作播放、步进、修改参数