跳转至

分页存储与地址转换

这部分属于 操作系统 → 存储管理 → 分页存储管理。解题的关键是把一个地址拆成“第几页”和“页内的哪个位置”,再通过页表找到对应的物理页框。

1. 页、页框和页内偏移

  • 逻辑页:进程地址空间中固定大小的一段。
  • 物理页框(物理块):主存中同样大小的一段,可以装入一个逻辑页。
  • 页表:记录逻辑页号到物理页框号的映射,通常每个进程有自己的页表。
  • 页内偏移:相对该页起点的距离,用来定位页内的具体位置。

下面假设按字节编址,页大小为 1 KB = 1024 B,页号、页框号和偏移都从 0 开始。

逻辑页号 逻辑地址范围 页内偏移范围
0 0~1023 0~1023
1 1024~2047 0~1023
2 2048~3071 0~1023

一页包含多个逻辑地址。 在这个例子中,一页有 1024 个字节位置,也就对应 1024 个逻辑地址。一个变量如果占多个字节,会占用多个地址位置,也可能跨页。

2. 地址转换公式

设逻辑地址为 A,页大小为 P:

1
2
3
4
5
6
逻辑页号 p = A // P
页内偏移 d = A % P

查页表:逻辑页 p → 物理页框 f

物理地址 = f × P + d

// 表示整数除法,% 表示求余数。分页映射改变页号对应的页框号,页内偏移保持不变。

1
2
3
4
5
逻辑地址 A
  ├─ 页号 p ──查当前进程的页表──→ 页框号 f
  └─ 偏移 d ─────────────────→ 偏移 d

物理地址 = f × 页大小 + d

若页大小为 2^k 字节,地址的低 k 位就是页内偏移。例如 1 KB = 2¹⁰ B,需要 10 位表示偏移,其余高位表示页号。

3. 例题:逻辑地址 1024 对应哪个物理块

题设:页大小为 1 KB,物理页框编号为 0~9,进程 A、B 的页表如下。表中的“待填”是题目要求补充的共享映射。

逻辑页号 A 的物理页框号 B 的物理页框号
0 8 1
1 3 6
2 5 9
3 2 7
4 待填 0
5 — 待填

求进程 A 的逻辑地址 1024 所在的物理块号:

1
2
3
4
逻辑页号 = 1024 // 1024 = 1
页内偏移 = 1024 % 1024 = 0

查 A 的页表:逻辑页 1 → 物理页框 3

因此,题目问的 物理块号是 3。如果问完整的物理地址,还要再计算:

物理地址 = 3 × 1024 + 0 = 3072

页号、页框号是“块的编号”,完整地址还包含块内的位置,不能混为同一个答案。

换成逻辑地址 1124

1
2
3
4
5
逻辑页号 = 1124 // 1024 = 1
页内偏移 = 1124 % 1024 = 100

仍查 A 的逻辑页 1,得到页框 3
物理地址 = 3 × 1024 + 100 = 3172

1024 和 1124 都在同一逻辑页内,映射到同一个物理页框,但它们的页内偏移不同。

4. 两个进程怎样共享同一物理页

题目要求把物理页框 4 分别映射到 A 的逻辑页 4、B 的逻辑页 5。那么在各自页表里填写:

A 的页表:逻辑页 4 → 物理页框 4
B 的页表:逻辑页 5 → 物理页框 4

所以两个待填值都是 4。

各进程的逻辑页号可以不同,只要对应同一个物理页框,就能访问同一页物理内存。例如访问该页的第一个字节:

进程 逻辑地址 转换后的物理地址
A 4 × 1024 = 4096 4 × 1024 = 4096
B 5 × 1024 = 5120 4 × 1024 = 4096

A 的逻辑地址恰好与物理地址数值相同,只是这次映射碰巧相同,不能据此跳过页表。共享还受访问权限约束;多个进程同时修改共享数据时,需要适当的同步。

5. “逻辑页 0、偏移 0”是地址 0 还是 1

按本例从 0 开始编号:

1
2
3
逻辑地址 = 逻辑页号 × 页大小 + 偏移
         = 0 × 1024 + 0
         = 0

它是 逻辑地址 0,也就是第一个字节位置。“第一个”描述顺序,地址编号则是 0。

对进程 A,逻辑页 0 映射到物理页框 8,所以这个位置的物理地址是:

8 × 1024 + 0 = 8192

还要区分 地址 和 地址处存放的内容:地址 0 处可以存放任意允许的字节值,不一定是 0 或 1。仅凭页号和偏移,算不出该位置的数据值。

6. 解题顺序与易错点

  1. 先把页大小换成与地址编址单位一致的数值,本例是 1024 字节。
  2. 地址除以页大小:商是页号,余数是偏移。
  3. 查当前进程的页表,找到物理页框号。
  4. 看清题目问“物理块号”还是“物理地址”;只有后者需要再乘页大小并加偏移。

常见边界:逻辑地址 1023 仍在第 0 页,1024 已进入第 1 页。页表中的物理页框号不需要连续,也不需要和逻辑页号相同。

这里假设页面已经驻留内存且访问权限合法。若页表表明页面未驻留,可能触发缺页处理,不能直接拿一个不存在的有效映射继续算。TLB 是地址转换的缓存,TLB 未命中不等于发生缺页。

7. 思维导图

--- markmap: height: 600 initialExpandLevel: 2 autoFit: true colorFreezeLevel: 2 maxWidth: 280 spacingHorizontal: 80 spacingVertical: 12 nodeMinHeight: 24 paddingX: 10 --- # 分页与地址转换 ## 基本概念 - 逻辑页:进程地址空间的一页 - 物理页框:内存中同样大小的一块 - 页表:逻辑页号映射到物理页框号 - 页内偏移:页内具体位置,从 0 开始 ## 三步计算 - 页号 = 逻辑地址 // 页大小 - 偏移 = 逻辑地址 % 页大小 - 物理地址 = 查得的页框号 × 页大小 + 偏移 ## 1 KB 页的例子 - 一页有 1024 个字节地址 - A 的逻辑页 1 映射到物理页框 3 - 逻辑地址 1024 → 页框 3,物理地址 3072 - 逻辑地址 1124 → 偏移 100,物理地址 3172 ## 共享页 - A 的逻辑页 4 → 物理页框 4 - B 的逻辑页 5 → 物理页框 4 - 不同逻辑地址可以映射到相同物理地址 ## 易错点 - 页号不是完整地址 - 地址不是该地址处存放的数据 - 偏移保持不变 - 内存分页不等于磁盘文件的索引分配

相关笔记:索引文件结构 · 位示图。

返回操作系统章节