虚拟内存-2级分页表原理

虚拟内存中的分页

  • 每个进程都有一个页表,
  • 每个进程可以占据大量的虚存空间

概念:

  1. 页表项 : 页表中的每个项记录了每个页对应的页框号

  • 不带单位默认为字节Byte
问题

假设进程的虚存空间为 2 G B = 2 31 2GB=2^{31} 2GB=231,若使用 2 9 = 512 2^9 = 512 29=512个字节的页,那么进程需要 2 31 / 2 9 = 2 22 2^{31}/2^9 = 2^{22} 231/29=222页表项.

导致进程加载到内存时,创建的页表占用的内存空间太大.

  • 大多数虚拟内存方案都在虚存中保存页表, 那么说明页表也能像页一样能够被分开,(分页技术)
  • 分页技术 同样来 分页表将1个大页表分成多个页表
  • 使得当一个进程正在运行时,页表至少有一个部分在内存中,且该部分包含正在运行的页 的页表项

使用二级方案来组织大型页表

  • 分页技术 同样来 分页表将1个大页表分成多个页表
原理:
  1. 有一个页目录,每一项指向一个页表,

    页目录长度为x,且页表最大长度为y,则一个进程可以有x*y

  2. 典型情况下: 页目录的一个页表的最大长度被限制为1 (重要限制),

32位地址的两级方案:

图片

  1. 采用字节级寻址,因为是32位一个地址,等价4Byte一个地址,

    • 不带单位默认为字节Byte
  2. 规定的大小为 4 K B = 2 12 4KB = 2^{12} 4KB=212, 因为页表只包含1个页,下面简称此类 页表 为 页,

  3. 4 G B = 2 32 4GB=2^{32} 4GB=232虚拟地址空间需要 2 32 / 2 12 = 2 20 2^{32}/2^{12}=2^{20} 232/212=220个页(页表)组成 (称为第三层)

  • 如何优化查询页表?
  • 若上面的每个页(页表)都由4个字节的地址映射可以找到,

    1. 则创建一个新页表,每个页表项4个字节的地址,指向 2 20 2^{20} 220页(页表),
    2. 新页表的大小为 2 20 ∗ 4 = 2 22 = 4 M B 2^{20}*4=2^{22}=4MB 2204=222=4MB内存空间, (称为第二次
    3. 又因为规定了页的大小 2 12 2^{12} 212,则该新页表 2 22 / 2 12 = 2 10 2^{22}/2^{12}=2^{10} 222/212=210页(页表),每个页(页表)含有 2 10 2^{10} 210 4 4 4字节地址

    总结:

    第二层( 4 M B 4MB 4MB) = 2 10 2^{10} 210页(页表) = 2 20 2^{20} 2204字节地址

  • 因为每个页(页表)都由4个字节的地址映射可以找到, 则第二层的页(页表)又可以由 2 10 2^{10} 210 4 4 4字节地址组成

    1. 这个 2 10 2^{10} 210 4 4 4字节地址 2 10 ∗ 4 = 2 12 2^{10}*4=2^{12} 2104=212组成根页表,占据内存 2 12 = 4 K B 2^{12}=4KB 212=4KB (称为第一层)
虚拟地址如何通过第一层的根页表找到在内存中的地址
32位虚拟地址结构
  • [ 10 位 ] [ 10 位 ] [ 12 位 ] [10位][10位][12位] [10][10][12]
  1. 第一个10位有 2 10 2^{10} 210个选择,则通过第一层 2 10 2^{10} 210个选择找到了第二层中 2 10 2^{10} 210个页(页表)中的一个

    • 现在位于第二层中的任意一个页(页表)
  2. 此时同样仍有 2 10 2^{10} 210个选择

  3. 来到了第三层,因为页表长度为1,找到的页表恰好有页框号

  4. 最后 页框号+12位偏移量 得到在内存中的地址

后记
  • 重要是理解 页表 页表项 的区别和联系
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值