概述
作用
- 将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据,通过这种方式高效地使用了主存
- 为每个进程提供了一致的地址空间,从而简化了内存管理
- 保护了每个进程的地址空间不被其他进程破坏。
寻址
虚拟内存
术语
- 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()函数来解除内存映射,释放相关资源。