0
点赞
收藏
分享

微信扫一扫

九.虚拟内存VM

肉肉七七 2023-05-21 阅读 30
缓存

概述

作用

  • 将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据,通过这种方式高效地使用了主存
  • 为每个进程提供了一致的地址空间,从而简化了内存管理
  • 保护了每个进程的地址空间不被其他进程破坏。

寻址

在这里插入图片描述

虚拟内存

术语

  • VM系统通过将虚拟内存分割为称为虚拟页(VirtualPage,VP)的大小固定的块来处理这个问题。每个虚拟页的大小为P=2p字节
  • 类似地,物理内存被分割为物理页(PhysicalPage,PP),大小也为P字节,物理页也被称为页帧(pageframe)

在这里插入图片描述

  • SRAM缓存:位于CPU和主存之间的LI、L2和L3高速缓存,
  • DRAM缓存:虚拟内存系统的缓存,在主存中缓存虚拟页。

页表

页表是**页表条目(PTE)**的数组,将虚拟页映射到物理页

在这里插入图片描述

缺页

在这里插入图片描述
MMU触发缺页中断/异常

下面是缺页异常子程序的一般执行流程:

  • 捕获缺页异常:当程序访问的页面不在物理内存中时,处理器会产生缺页异常,并将控制权转移给操作系统。

  • 保存上下文:操作系统会保存当前程序的上下文信息,包括寄存器状态、程序计数器等。

  • 查找页面:操作系统根据缺失的页面地址查找相应的页面是否在辅存中。

  • 加载页面:如果页面不在物理内存中,则操作系统需要将页面从辅存加载到物理内存中的空闲页面中。

  • 更新页表:操作系统更新页表,将缺失的页面与物理内存中的对应页面建立映射关系。

  • 恢复上下文:操作系统恢复保存的上下文信息,将控制权返回给引发缺页异常的程序。

  • 重新执行指令:一旦页面被加载到物理内存中,并且页表更新完成,程序可以继续执行引发缺页异常的指令。

地址翻译

翻译流程

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

(1) 处理器将虚拟地址发送给MMU
(2)(3)MMU利用虚拟地址对应的虚拟页号生成PTEA,并从页表中找到对应的PTE
(4) PTE中的有效位为0,MMU触发缺页异常
(5) 缺页处理程序选择物理内存中的性页(若页面被修改,则换出到磁盘)
(6) 缺页处理程序调入新的页面到内存,并更新PTE
(7) 缺页处理程序返回到原来进程,再次执行导致缺页的指令

TLB(翻译后备缓冲器)

在这里插入图片描述
在这里插入图片描述

多级页表

在这里插入图片描述

翻译实例

前提假设

有一个TLB和L1 d-cache的小系统,假设如下:
内存按字节寻址
内存访问针对1字节的字
虚拟地址14位长(n=14)
物理地址12位长(m=12)
页面大小64字节(P=64)
TLB四路组相联,共有16个条目
L1 d-cache物理寻址、直接映射,行大小为4字节,共有16个组
CPU执行指令为 读地址0x03d4

在这里插入图片描述

位数分析

页偏移为6位,即VPO、PPO为相同的6位
进而,VPN为 14 - 6 = 8 位,PTE有 28 = 256 个
PPN为 12 - 6 = 6 位

四路组相联,即TLBI为2位,因此TLBT为 14-6-2=6 位
16个条目,即理论可以容纳 28 = 256 个PTE,但实际只用到16个

在这里插入图片描述

行大小为4字节,即CO为2位
共有16个组,即CI为4位
进而,CT为 12(物理地址长度)-2-4=6 位

在这里插入图片描述

填入地址

在这里插入图片描述

因此,TLBT=0x03,TLBI=0x03,VPN=0x0f

在这里插入图片描述

因此,PPN=0x0D,6位二进制为001101,结合PPO的6位二进制为01 0100
TLB命中,不必看“图b)页表”,虽然0x0f对应的也是0D和有效位1

在这里插入图片描述

因此,CT=0x0D,CI=5,CO=0,并且有效位是1

在这里插入图片描述

最后,MMU将物理地址0x36传给CPU

Intel Core i7

在这里插入图片描述

在这里插入图片描述

Linux虚拟内存系统

在这里插入图片描述

内存映射

  • -在文件操作中,内存映射允许将文件的内容映射到进程的虚拟内存空间,从而可以直接通过内存访问文件的内容,而不需要使用read()和write()等系统调用来读写文件。这样可以简化文件的访问过程,并且能够提高文件的读写性能。

  • 共享内存是一种用于进程间通信的机制,通过内存映射,多个进程可以将同一块内存映射到它们各自的地址空间中,从而实现共享数据的读写。这样,进程间可以直接通过内存读写进行通信,而无需使用其他的进程间通信机制。

  • 匿名内存映射是一种用于动态分配内存的方式,通过映射一个没有关联文件的内存区域,进程可以在需要的时候动态分配内存。这种内存映射不会持久化到存储设备,只存在于进程的虚拟内存中,当进程结束时会自动释放。
    匿名文件(内核创建的、全是二进制0)

在这里插入图片描述

void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);

在这里插入图片描述
prot为访问权限位:读、写、执行、不能被访问
flag描述被映射对象类型:匿名对象、私有对象(写时复制)、共享对象
在使用完映射区域后,可以通过munmap()函数来解除内存映射,释放相关资源。

举报

相关推荐

0 条评论