天天看点

虚拟内存-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位地址的两级方案:

虚拟内存-2级分页表原理
  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 220∗4=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} 220 个

    4

    字节地址
  • 因为每个页(页表)都由

    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} 210∗4=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位偏移量 得到在内存中的地址
后记
  • 重要是理解页 页表 页表项 的区别和联系

继续阅读