试题 1
试题正文
已知某系统采用段式存储管理。假如一个进程的段表如下所示,其中存在位为1表示段在内存,为0表示段不在内存,存取控制字段中W表示可写,R表示可读,E表示可执行。对下面的指令,在执行时会产生什么样的结果?
答案:(惩罚系数: 0 %)
段表
| 段号 | 存在位 | 起始地址 | 段长 | 存取控制 |
| 0 | 1 | 2000 | 617 | R |
| 1 | 0 | 8000 | 173 | R |
| 2 | 1 | 5000 | 874 | R |
| 3 | 1 | 7000 | 523 | W |
| 4 | 1 | 4000 | 389 | R |
| 5 | 1 | 1000 | 496 | R |
请根据上面段表,设置以下每条指令执行的结果。如果不发生中断,需要计算出指令中逻辑地址对应的物理地址。空白处不得分。
✅段式存储管理的核心知识点
1️⃣段号是否合法(段号越界)
每条指令访问的地址由段号 + 段内偏移地址组成。
若访问的段号不存在或超过进程段表范围→段号越界异常。
2️⃣段是否在内存(存在位 valid bit)
每个段都有一个存在位(Valid/Invalid):
1 → 段已调入内存
0 → 段未调入内存,要发生 “缺段中断”
缺段中断让操作系统把该段调入内存。
(注意:只是“未在内存”≠访问非法,只是需要中断调页。)
3️⃣访问权限检查(R/W/E 权限)
段表中含有访问控制字:
R:只读
W:可读可写
E:可执行
访问权限如下:
| 操作 | 必须具备权限 |
|---|---|
| LOAD(读) | R 或 W |
| STORE(写) | W |
| JMP(跳转) | E |
如果试图执行不允许的访问类型 →保护性中断(Protection Fault)
4️⃣段内偏移是否合法(越界检查)
每个段有一个段长 limit
若偏移地址 ≥ 段长→段内越界中断(Address Out-of-Bounds)
段号合法 ≠ 段内偏移合法。
5️⃣段表项中给出物理基址(Base)
若段号合法、段存在、权限正确、偏移合法,则:
物理地址 = 段基址 + 段内偏移地址
这一步在所有检查都通过后才进行。
6️⃣各种中断类型的适用情况
| 中断类型 | 产生原因 |
|---|---|
| 段号越界中断 | 段号无效、段不存在 |
| 缺段中断 | 段号合法但存在位=0(段不在内存) |
| 段内越界中断 | 段在内存但偏移超出段长 |
| 保护性中断 | 访问权限不符(如读不可读段、写不可写段、跳转不可执行段) |
| 无中断 | 全部检查通过 |
7️⃣JMP 的特殊性
JMP 指令访问的是指令段,需要执行权限(E)
若跳转目标段没有执行权限 → 保护性中断
若偏移超界 → 段内越界中断
特点:JMP 不产生物理地址输出,因为它改变的是下一条指令的逻辑地址。
8️⃣LOAD / STORE 的判断流程
LOAD(读取)
必须满足:
段号合法
段在内存(否则缺段)
偏移合法
段权限允许读(R 或 W)
→ 访问成功,可计算物理地址
STORE(写入)
必须满足:
段号合法
段在内存
偏移合法
段权限必须为 W
→ 否则保护性中断
9️⃣段式管理的本质:逻辑地址二元结构
逻辑地址 =(段号 s, 段内偏移 d)
段表查找流程:
段号 s 合法吗?
s 的段是否在内存?
权限是否允许该操作?
d 是否小于段长?
物理地址 = 基址 + d
任何一步不通过都会导致不同类型的中断。
🔟总结性框架(超级重要)
执行一条指令时的判断顺序:
段号合法性检查(越界中断)
段是否在内存(缺段中断)
访问权限检查(保护性中断)
段内偏移检查(越界中断)
生成物理地址(只有全部合法时)