分页存储与地址转换¶
这部分属于 操作系统 → 存储管理 → 分页存储管理。解题的关键是把一个地址拆成“第几页”和“页内的哪个位置”,再通过页表找到对应的物理页框。
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:
// 表示整数除法,% 表示求余数。分页映射改变页号对应的页框号,页内偏移保持不变。
若页大小为 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 所在的物理块号:
因此,题目问的 物理块号是 3。如果问完整的物理地址,还要再计算:
页号、页框号是“块的编号”,完整地址还包含块内的位置,不能混为同一个答案。
换成逻辑地址 1124¶
1024 和 1124 都在同一逻辑页内,映射到同一个物理页框,但它们的页内偏移不同。
4. 两个进程怎样共享同一物理页¶
题目要求把物理页框 4 分别映射到 A 的逻辑页 4、B 的逻辑页 5。那么在各自页表里填写:
所以两个待填值都是 4。
各进程的逻辑页号可以不同,只要对应同一个物理页框,就能访问同一页物理内存。例如访问该页的第一个字节:
| 进程 | 逻辑地址 | 转换后的物理地址 |
|---|---|---|
| A | 4 × 1024 = 4096 |
4 × 1024 = 4096 |
| B | 5 × 1024 = 5120 |
4 × 1024 = 4096 |
A 的逻辑地址恰好与物理地址数值相同,只是这次映射碰巧相同,不能据此跳过页表。共享还受访问权限约束;多个进程同时修改共享数据时,需要适当的同步。
5. “逻辑页 0、偏移 0”是地址 0 还是 1¶
按本例从 0 开始编号:
它是 逻辑地址 0,也就是第一个字节位置。“第一个”描述顺序,地址编号则是 0。
对进程 A,逻辑页 0 映射到物理页框 8,所以这个位置的物理地址是:
还要区分 地址 和 地址处存放的内容:地址 0 处可以存放任意允许的字节值,不一定是 0 或 1。仅凭页号和偏移,算不出该位置的数据值。
6. 解题顺序与易错点¶
- 先把页大小换成与地址编址单位一致的数值,本例是 1024 字节。
- 地址除以页大小:商是页号,余数是偏移。
- 查当前进程的页表,找到物理页框号。
- 看清题目问“物理块号”还是“物理地址”;只有后者需要再乘页大小并加偏移。
常见边界:逻辑地址 1023 仍在第 0 页,1024 已进入第 1 页。页表中的物理页框号不需要连续,也不需要和逻辑页号相同。
这里假设页面已经驻留内存且访问权限合法。若页表表明页面未驻留,可能触发缺页处理,不能直接拿一个不存在的有效映射继续算。TLB 是地址转换的缓存,TLB 未命中不等于发生缺页。