Skip to content

2013年 408 操作系统 第 46 题

操作系统2013年综合题8分

题目

某计算机主存按字节编址,逻辑地址和物理地址都是 32 位页表项大小为 4 字节。请回答下列问题:

(1) 若使用一级页表的分页存储管理方式,逻辑地址结构为:

3112页号20 bits110页内偏移12 bits

页的大小是多少字节?页表最大占用多少字节?

(2) 若使用二级页表的分页存储管理方式,逻辑地址结构为:

3122页目录号10 bits2112页表索引10 bits110页内偏移12 bits

设逻辑地址为 LA,请分别给出其对应的页目录号和页表索引的表达式。

(3) 采用 (1) 中的分页存储管理方式,一个代码段起始逻辑地址为 0000 8000H,其长度为 8 KB,被装载到从物理地址 0090 0000H 开始的连续主存空间中。页表从主存 0020 0000H 开始的物理地址处连续存放(地址自下向上递增)。请计算:

  • 该代码段对应的两个页表项的物理地址
  • 这两个页表项中的页框号
  • 代码页面 2 的起始物理地址

解析

(1)页大小 + 页表最大字节数

页内偏移 12 位 → 页大小 = B = 4 KB

页号 20 位 → 页表项数 =

编者注(页表大就是一级页表的痛点)

  • 一个进程的页表本身就要 4 MB——而且必须连续存放在物理内存里(一级页表的硬约束)。
  • 这是为什么现代系统都用二级 / 多级页表——把"页表自己"分成可按需调入的小块,避免 4 MB 一次性占用。

(2)从 LA 提取页目录号 / 页表索引

页目录号(高 10 位)

C 表达式:

c
((unsigned int)(LA) >> 22) & 0x3FF

页表索引(中 10 位)

C 表达式:

c
((unsigned int)(LA) >> 12) & 0x3FF

编者注(位运算技巧)

  • 提取位段的统一公式:(addr >> 起始位) & ((1 << 段宽) - 1)
  • 本题段宽 10 位 → 掩码 =
  • 必须用 unsigned int——若用 int,右移负数地址会产生算术右移导致结果错。
  • 也可以写"先掩码后右移"(addr & 0xFFC00000) >> 22,效果相同。

(3)求页表项物理地址 + 页框号 + 页面 2 物理地址

Step 1:代码段在哪几页?

代码段起始逻辑地址 0000 8000H,长度 8 KB = 2 页(每页 4 KB)。

代码段起始页号

→ 占用页号 8页号 9 两页。

页号内容
8代码页面 1(逻辑地址 0x00008000 ~ 0x00008FFF)
9代码页面 2(逻辑地址 0x00009000 ~ 0x00009FFF)

Step 2:求页表项的物理地址

页表起始物理地址 = 0x00200000,每项 4 B:

Step 3:求两个页表项中的页框号

代码段被连续装入物理地址 0x00900000 开始的空间,长度 8 KB = 2 个页框:

物理页框起始物理地址页框号
第 1 个0x00900000 = 900H
第 2 个0x00901000 = 901H

所以:

  • 页表项 8 中的页框号 = 900H(指向代码页面 1)
  • 页表项 9 中的页框号 = 901H(指向代码页面 2)

Step 4:代码页面 2 起始物理地址

代码页面 2 占用页框号 901H,起始物理地址:

答案汇总(一图速览)

页表项 1(页号 8)物理地址00200020H
页表项 2(页号 9)物理地址00200024H
页表项 1 中的页框号00900H(即 900H)
页表项 2 中的页框号00901H(即 901H)
代码页面 2 起始物理地址00901000H

编者注("逻辑地址-页号-页表项-页框-物理地址" 五步链)

  1. 逻辑地址 → 页号:右移页内偏移位数
  2. 页号 → 页表项物理地址:页表起始物理地址 + 页号 × 页表项大小
  3. 页表项 → 页框号:读那个页表项的"页框号字段"(低 20 位若占满,否则掩码取一段)
  4. 页框号 → 页起始物理地址:页框号左移页内偏移位数
  5. 页起始物理地址 + 页内偏移 → 物理地址

这条链是页式管理的核心计算流程,所有相关大题(本题、2018-45、2024-45、2026-46)都在反复考察这个流程的某些片段。记住这五步、能反向推导,地址转换题就稳了

最后更新:

⚠️ 这道题暂未配可视化,欢迎在 CodeBrick 反馈区告诉我们你想看哪道题