计算机基础-操作系统-操作系统-两级页表
页表必须连续存放,因此当页表很大时,需要占用很多个连续的页框
将长长的页表进行分组,使每个内存块刚好可以放入一个分组
比如页面大小 4KB ,每个页表项 4B ,每个页面可存放 1K 个页表项,因此每 1K 个连续的页表项为一组,每组刚好占一个内存块,再将各组离散地放到各个内存块中
另外,要为离散分配的页表再建立一张页表,称为页目录表,或称外层页表,或称顶层页表
1. 两级页表原理
单级页表的逻辑地址结构: 32 位逻辑地址空间,页表项大小为 4B,页面大小为 4KB,则页内地址占 12 位
31 $\cdots\cdots$ 12 | 11 $\cdots\cdots$ 0 |
---|---|
页号 | 页内偏移量 |
二级页表的逻辑地址结构:
31 $ \cdots\cdots $ 22 | 21 $\cdots\cdots$ 12 | 11 $\cdots\cdots$ 0 |
---|---|---|
一级页号 | 二级页号 | 页内偏移量 |
2.地址变换
例: 将逻辑地址(0000000000,0000006004,111111121112)转换为物理地址(用十进制表示)
- 按照地址结构将逻辑地址拆分成三部分
- 从 PCB 中读出页目录表始址,再根据一级页号查页目录表,找到下一级页表在内存中的存放位置
- 根据二级页号查表,找到最终想访问的内存块号
- 结合页内偏移量得到物理地址
最终要访问的内存块号为: $4$
该内存块的起始地址为: $4 \times 4096= 16384$
页内偏移量为: $1023$
最终的物理地址为: $16384 + 1023 = 17407$
3. 缺页中断
根据局部性原理可知,没有必要让整个页表常驻内存,因为进程在一段时间内可能只需要访问某几个特定的页面,因此可以在需要访问页面时才把页面调入内存(虚拟存储技术)。可以在页表项中增标志位,用于表示该页面是否已经调入内存
若想访问的页面不在内存中,则产生缺页中断(内中断),然后将目标页面从外存调入内存
4. 注意
若采用多级页表机制,则各级页表的大小不能超过一个页面
某系统按字节编址,采用 40 位逻辑地址,页面大小为 4KB,页表项大小为 4K,假设来用纯页式存储,则要采用()级页表,页内偏移量为()位
页面大小 = $4KB = 2^{12}B$,按字节编址,因此页内偏移量为 12 位
页号: $40-12=28$ 位
页面大小 = $2^{12}B$,页表项大小=4B,则每个页面可存放 $2^{12} / 4=2^{10}$ 个页表项
因此各级页表最多包含 $2^{10}$ 个页表项,需要 10 位二进制位才能映射到 2M 个页表项,因此每一级的页表对应页号应为10位。总共28位的页号至少要分为三级:如果只分为两级页表,则一级页号占 18 位,也就是说页目录表中最多可能有 $2^{18}$ 个页表项,一个页面是放不下这么多页表项的。
两级页表的访存次数分析(假设没有快表机构)
- 第一次访存: 访问内存中的页目录表
- 第二次访存: 访问内存中的二级页表
- 第三次访存: 访问目标内存单元