虚拟内存-2级分页表原理
虚拟内存中的分页
- 每个进程都有一个页表,
- 每个进程可以占据大量的虚存空间
概念:
- 页表项 : 页表中的每个项记录了每个页对应的页框号
- 不带单位默认为字节
Byte
问题
假设进程的虚存空间为$2GB=2^{31}$,若使用$2^9 = 512$个字节的页,那么进程需要$2^{31}/2^9 = 2^{22}$个页表项.
导致进程加载到内存时,创建的页表占用的内存空间太大.
- 大多数虚拟内存方案都在虚存中保存页表, 那么说明页表也能像页一样能够被分开,(分页技术)
- 分页技术 同样来 分页表 : 将1个大页表分成多个页表
- 使得当一个进程正在运行时,页表至少有一个部分在内存中,且该部分包含正在运行的页 的页表项
使用二级方案来组织大型页表
- 分页技术 同样来 分页表 : 将1个大页表分成多个页表
原理:
有一个页目录,每一项指向一个页表,
若页目录长度为
x
,且页表最大长度为y
,则一个进程可以有x*y
页典型情况下: 页目录的一个页表的最大长度被限制为
1
页 (重要限制),
32位地址的两级方案:
采用字节级寻址,因为是
32
位一个地址,等价4Byte
一个地址,
- 不带单位默认为字节
Byte
规定页的大小为$4KB = 2^{12}$, 因为页表只包含1个页,下面简称此类 页表 为 页,
则$4GB=2^{32}$虚拟地址空间需要$2^{32}/2^{12}=2^{20}$个页(页表)组成 (称为第三层)
- 如何优化查询页表?
若上面的每个页(页表)**都由
4
个字节的地址**映射可以找到,- 则创建一个新页表,每个页表项是
4
个字节的地址,指向该$2^{20}$个页(页表), - 新页表的大小为$2^{20}*4=2^{22}=4MB$的内存空间, (称为第二次)
- 又因为规定了页的大小$2^{12}$**,则该新页表有 $2^{22}/2^{12}=2^{10}$个页(页表),每个页(页表)含有**$2^{10}$个 $4$字节地址
总结:
第二层($4MB$) = $2^{10}$个页(页表) = $2^{20}$ 个
4
字节地址- 则创建一个新页表,每个页表项是
因为每个页(页表)**都由
4
个字节的地址映射可以找到, 则第二层的页(页表)又可以由$2^{10}$个 **$4$字节地址组成- 这个$2^{10}$个$4$字节地址 $2^{10}*4=2^{12}$组成根页表,占据内存$2^{12}=4KB$ (称为第一层)
虚拟地址如何通过第一层的根页表找到在内存中的地址
32位虚拟地址结构
- $[10位][10位][12位]$
第一个10位有$2^{10}$个选择,则通过第一层$2^{10}$个选择找到了第二层中$2^{10}$个页(页表)中的一个
- 现在位于第二层中的任意一个页(页表)
此时同样仍有$2^{10}$个选择
来到了第三层,因为页表长度为1,找到的页表恰好有页的页框号
最后 页框号+12位偏移量 得到在内存中的地址
后记
- 重要是理解页 页表 页表项 的区别和联系
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!