非连续内存分配优点

  • 一个程序的物理地址是非连续的
  • 更好的内存利用和管理
  • 允许共享代码与数据
  • 支持动态加载和动态链接

潜在问题

  • 如何建立虚拟地址与物理地址之间的转换
    • 软件方案
    • 硬件方案
      • 分段
      • 分页

分段

程序的分段地址空间

  • 将逻辑地址空间分成各个块
image-20200418141948265
  • 如下图,需要一种运行机制,来使逻辑地址空间物理地址空间之间有对应的关联

image-20200418142034374image-20200418142254435

image-20200418142312648

分段寻址方案

  • 两种实现方案:

    • 段寄存器 + 地址寄存器:将段号和段内偏移分开放置

    • 单地址实现方案:将段号和段内偏移放在一起

image-20200418142553901image-20200418143008669

image-20200418143028307

分页

  • 现在CPU主要使用分页方式

分页地址空间

  • 与分段方式相似,同样拥有页号和偏移

  • 不同之处在于分段中段的大小可变,而分页中页的大小固定的

  • 帧(frame)和页(page):

    • 划分物理内存至固定大小的:大小是2的幂次方

      image-20200418144103065 image-20200418144606645
    • 划分逻辑地址空间至相同大小的:大小也是2的幂次方

      image-20200418145629651 image-20200418145930471

      依据逻辑地址的页号到页表中查询出物理地址的帧号

  • 建立方案转化逻辑地址为物理地址(pages to frames)

页的寻址方案

image-20200418150212728

页表

概述

  • 页表其实就是一个大数组,索引代表的是 page_number,索引对应的值存的是 frame_number

    image-20200418150738864
image-20200418151533051
  • 存在问题:访问一个内存单元需要两次访问内存,存在性能问题
    • 一次获取页表项
    • 一次用于访问数据

TLB(Translation Look-aside Buffer)

  • 缓存近期访问的页帧转换表项
    • TLB使用关联内存(速度快容量小)实现,具备快速访问性能
    • 如果查到,则物理帧号可以被快速获取
    • 如果查不到,就在页表中进行查找然后将内容更新到TLB

二级、多级页表(时间换空间)

  • 会增加时间开销
  • 省下空间(一级页表中的保留位为0,二级页表就不需要留位置了)
image-20200418153639436 image-20200418153843016

反向页表

  • 大地址空间问题:
    • 有大地址空间,向前映射页表变得繁琐(5级页表)
    • 不是让页表与逻辑地址空间的大小相对应,而是让页表与物理地址空间的大小相对于(虚拟地址空间增长速度快于物理地址空间)

image-20200418155010474image-20200418155148496

image-20200418155557962