CSAPP笔记(第九章 虚拟内存)-01

第九章的内容为p595~p649, 分2部分, p596~p618, p618~p649. 本文为第1部分.

摘要

本章主要写虚拟内存的原理. 与我之前理解的虚拟内存有很大不同, 之前"以为"的虚拟内存是由于内存容量不够, 临时将内存暂时用不到的部分存到磁盘上.
应用程序直接与内存交互, 磁盘只是一个备用的存储.

实际上读了本章发现, 应用程序直接对应虚拟内存, 虚拟内存对应磁盘, 而物理内存是磁盘的缓存. 应用程序需要读取某块虚拟内存的内容时, 先查表看是否物理内存命中, 命中了则从物理内存中读取, 否则触发缺页中断, 从磁盘上将内容复制到物理内存中后, 再继续读取. 而物理内存满后, 则会淘汰物理内存页, 将淘汰的物理内存页写回磁盘.

这里有一些细节省略了, CPU拿到的是虚拟地址, 需要MMU单元对虚拟地址进行翻译, 翻译为物理地址并取到数据, 在翻译的过程中, 会做很多事情.

  1. 首先地址是分了页的, 一般4K为一页, 先取到虚拟页号
  2. 虚拟页号, 划分为TLBI和TLBT, 根据这2个值去TLB(虚拟页号与物理页号对应关系缓存)中取物理页号
  3. 如果TLB缓存命中, 则执行下一步, 否则要去内存中取虚拟页号与物理页号对应关系
  4. 根据物理页号与虚拟偏移量, 拼出物理地址, 划分为CO, CI, CT. 根据这3个值去L1高速缓存查找数据
  5. 如果L1高速缓存命中, 则返回数据; 否则去内存中查找数据.
  6. 如果内存命中, 则将数据复制到L1高速缓存, 通过高速缓存进行返回; 否则触发缺页中断, 等待磁盘写入内存(DMA)

上面讲的是读数据的情况, 写数据有两种模式, 直写(write through)与回写(write back). 直写是指写入数据时, 不光要将数据写入L1高速缓存, 同时也要写入内存, 保证数据的强一致性. 回写是指先写入L1高速缓存, 等总线不繁忙时, 再写入内存. 现在采用的是回写方式.

上面的过程还省略了, 翻译时的权限判断, 多级页表等内容.

缩写

本章缩写很多, 先记录一下.

  • PA: Physical Address, 物理地址. M=2^m.

  • VA: Virtual Address, 虚拟地址. N=2^n

  • MMU; Memory Management Unit, 内存管理单元

  • VP: Virtual Page, 虚拟页. P=2^p, 虚拟页大小, 如4K.

  • PP: Physical Page, 物理页, 也被称为page frame

  • PTE: Page Table Entry, 页表条目

  • VPO: 虚拟页面偏移量(字节)

  • VPN: 虚拟页号

  • TLBI: TLB索引

  • TLBT: TLB标记

  • PPO: 物理页面偏移量(字节)

  • PPN: 物理页号

  • CO: 缓冲块内的字节偏移量

  • Cl: 高速缓存索引

  • CT: 高速缓存标记

  • PTBR: Page Table Base Register, 页表基址寄存器

  • TLB: Translation Lookaside Buffer, 翻译后背缓冲器

posted @   Panda110  阅读(172)  评论(0编辑  收藏  举报
编辑推荐:
· 对象命名为何需要避免'-er'和'-or'后缀
· SQL Server如何跟踪自动统计信息更新?
· AI与.NET技术实操系列:使用Catalyst进行自然语言处理
· 分享一个我遇到过的“量子力学”级别的BUG。
· Linux系列:如何调试 malloc 的底层源码
阅读排行:
· JDK 24 发布,新特性解读!
· C# 中比较实用的关键字,基础高频面试题!
· .NET 10 Preview 2 增强了 Blazor 和.NET MAUI
· Ollama系列05:Ollama API 使用指南
· 为什么AI教师难以实现
点击右上角即可分享
微信分享提示