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

虚拟内存中的分页

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

概念:

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

  • 不带单位默认为字节Byte

问题

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

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

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

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

  • 分页技术 同样来 分页表将1个大页表分成多个页表

原理:

  1. 有一个页目录,每一项指向一个页表,

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

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

32位地址的两级方案:

图片

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

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

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

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

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

    总结:

    第二层($4MB$) = $2^{10}$个页(页表) = $2^{20}$ 个4字节地址

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

    1. 这个$2^{10}$个$4$字节地址 $2^{10}*4=2^{12}$组成根页表,占据内存$2^{12}=4KB$ (称为第一层)

虚拟地址如何通过第一层的根页表找到在内存中的地址

32位虚拟地址结构
  • $[10位][10位][12位]$
  1. 第一个10位有$2^{10}$个选择,则通过第一层$2^{10}$个选择找到了第二层中$2^{10}$个页(页表)中的一个

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

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

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

后记
  • 重要是理解 页表 页表项 的区别和联系