CSAPP复习之虚拟内存

虚拟内存:概念

物理和虚拟寻址

  • 物理寻址
    • 物理地址 PA
    • 主存被组织成一个由M个连续的字节大小的单元组成的数组
    • 简单的寻址模式
      • ( R )
        • mem[reg[R]]
      • D( R )
        • mem[reg[R]+D]
  • 虚拟寻址
    • 虚拟地址 VA
    • 地址翻译

地址空间

  • 线性地址空间

    • 地址空间中的整数是连续的
      • 均假设是线性的
  • 虚拟地址空间

    • N=2n
  • 物理地址空间

    • M=2m

虚拟内存作为缓存的工具

  • 虚拟内存是存储在磁盘上的N个连续字节的数组

    • 部分内容被缓存在DRAM中
    • 虚拟页 VP
      • 将虚拟内存分割为VP大小的块
      • P=2p
      • 虚拟页面有三种情况
        • 未分配的
          • VM系统还未分配的页,不占任何磁盘空间
        • 缓存的
        • 未缓存的
    • 物理页 PP
      • 将物理内存分割为PP大小的块
      • 大小也为P字节
  • DRAM缓存是被大量的不命中开销驱动的

    • DRAM缓存表示虚拟内存系统的缓存,它在主存中缓存虚拟页
    • 虚拟页往往很大
      • 一般是4KB
        • linux 大页 2MB-1GB
    • 全相连
      • 任何VP都可以放在任何PP中
    • 极为复杂的替换算法
      • 不在考虑范围
    • 总是使用写回而不是直写
  • 页表

    • 页表条目(PTE)的数组
    • 将虚拟页映射到物理页
    • 虚拟地址空间的每个页在页表中一个固定偏移量的地方都有一个PTE
    • PTE
      • 有效位
        • 表明该虚拟页是否被缓存在DRAM中
      • n位地址字段
        • 如果设置了有效位,地址字段表示DRAM中相应的物理页的起始位置
        • 没有设置有效位
          • 空地址表示未分配
          • 未缓存则指向该虚拟页在磁盘上的起始位置
  • 页命中

    • VP2被缓存在DRAM中
    • 访问VP2
      • 地址翻译定位PTE2
      • 检查设置了有效位
      • 使用PTE中的物理内存地址
  • 缺页

    • DRAM缓存不命中
    • 触发缺页异常
      • 选择一个牺牲页
      • 将未被缓存的VP缓存到牺牲页的位置并更新PTE
      • 重启触发缺页异常的访问
      • 命中
  • 分配页面

    • 在磁盘上创建空间并更新PTE
  • 局部性原理

    • 工作集
      • 程序趋向于在一个较小的活动页面集合上工作
    • 若工作集的大小超出了物理内存的大小,将产生抖动
      • 性能急剧下降

虚拟内存作为内存管理的工具

  • 每个进程有独立的虚拟地址空间

    • 每个进程有独立的页表
  • VM简化链接

    • 每个程序都有相似的虚拟地址空间
    • 代码段、数据段、堆都从同样的地址开始
  • VM简化加载

    • 为代码段和数据段分配虚拟页,把他们标记为未被缓存的
  • VM简化内存分配

    • 程序要求额外的堆空间时
      • 操作系统分配k个连续的虚拟内存页面并将它们映射到k个任意位置的物理页面
      • 物理页面不需要连续

虚拟内存作为内存保护的工具

  • 在PTE上添加一些额外的许可位来控制对一个虚拟页面内容的访问

地址翻译

  • N M P

  • n位的虚拟地址包括

    • p位的虚拟页面偏移 VPO
    • n-p位的虚拟页号 VPN
  • 利用VPN选择适当的PTE

    • 例如 VPN0选择PTE0,VPN1选择PTE1
  • 将页表条目中的物理页号和虚拟地址中的VPO串联起来就得到了物理地址

  • 由于PP和VP都是P字节所以PPO和VPO相同

  • 页面命中

    • CPU把虚拟地址发给MMU
    • MMU通过虚拟地址生成PTE地址并请求
    • 缓存/内存返回PTE
    • MMU构造物理地址,并把它返回给缓存/内存
    • 缓存/内存将数据返回给CPU
  • 缺页

    • 1-3步和命中一样
    • 有效位为0,触发缺页异常
    • 确定牺牲页,如果牺牲页在之前的操作中被修改过,则把它换出到磁盘
    • 调入新的页面,更新PTE
    • 返回到原来的进程,再次执行导致缺页的指令
  • 利用TLB加速地址翻译

    • TLB是一个小的、虚拟寻址的缓存

      • 每一行都保存着一个由单个PTE组成的块
    • 匹配TLB的索引和标记来自VPN

      • 如果TLB有T=2t个组,则TLB索引(TLBI)是由VPN的t个最低位组成的
      • TLB标记(TLBT)是由VPN剩余的位构成
    • TLB命中

      • CPU产生虚拟地址
      • MMU从TLB取出对应PTE
      • 根据PTE翻译出物理地址,发送给缓存/内存
      • 缓存/内存将数据返回给CPU
    • TLB不命中

      • 需从缓存中取出相应的PTE放在TLB中
      • 很少见
  • 多级页面

    • 用单级页表会让页表的大小变得非常大

    • 二级页表

      • 一级页表中的每个PTE负责映射虚拟地址空间中一个4MB的片
        • 每一个片由1024个连续的页面组成
        • 如果1024个页面均未分配则一级PTE i为空
        • 若至少有一个页分配了,则一级PTE i指向一个二级页表的基地址
      • 二级页表每个PTE负责映射一个4KB的虚拟内存页面
    • k级页表地址翻译

      • 虚拟地址被划分成k个VPN和一个VPO
      • 每个VPN i是一个到第i级页表的索引
      • 前k-1个页表,每个PTE都指向下一级的某个页表的基地址
      • 第k级页表中每个PTE包含某个物理页面的PPN

地址翻译实例

酷睿i7/Linux内存系统

  • linux使用的是4KB的页
  • 酷睿i7采用四级页表层次结构

内存映射

  • 将一个虚拟内存区域和一个磁盘的对象关联起来
  • 虚拟内存可以映射到
    • 文件系统中的普通文件
    • 匿名文件
      • 由内核创建的全是二进制0的文件
  • 写时复制
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值