跳转至

虚拟内存系统

为了方便管理程序运行时使用的内存空间,
memory management unit(mmu)内存管理单元,辅助操作系统管理内存。

内存类型 描述
物理内存 实际内存空间
虚拟内存 应用程序可以看到并使用的内存空间

内存寻址范围

地址总线范围数据总线大小决定
例如:
内存地址总线长度20bit,内存单元8bit,则访问2^20 * 8bit的内存空间,即2MB。
内存地址总线长度32bit,内存单元8bit,则访问2^32 * 8bit的内存空间,即4GB。

地址类型

地址类型 描述
逻辑地址 机器语言指令使用的地址,指定一个操作数的地址或一条指令的地址
线性地址 线性地址是一个无符号整数,范围0x00~0xffffffff(ffffffff),
由逻辑地址的段基址+段偏移计算得到
若无分页机制,线性地址即物理地址
物理地址 内存单元的实际地址,用于芯片级内存单元寻址

地址转换

逻辑地址→线性地址→物理地址,实际转换流程由MMU操作
mem

分页机制

虚拟内存空间物理内存空间固定大小划分成若干页
只将程序需要使用的映射到物理内存
内存

类型 说明
页框 page frame,分页单元把所有的RAM物理内存分成固定长度的页框,长度也是4KB或更大
分页单元将线性地址分成以固定长度位单位的组,称为页(page)。
页内部连续,映射是以页位基本单位。

4级页表

x86_64采用四级页表,来管理标准4KB页。
在x64体系中用48位的虚拟寻址
理论上48位地址长度可以管理512TB的地址空间
不过x86_64四级页表只使用了256TB的虚拟地址空间。
详见linux 4级内存页表虚拟地址空间范围
address 48bit线性地址划分为下面几部分:

字段 长度 描述
OFFSET 12bit 页内偏移量,对应4K范围
PT(Page Table) 9bit
PDT(Page Directory Table) 9bit 每个表4K,内含512个PDE结构,每个8字节
PDPT(Page Directory Pointer Table) 9bit 及表内的PDPTE结构
PML4T(Page Map Level4 Table) 9bit 及表内的PML4E结构
f/0 16bit 全填充0或f

同x86 32位一样,系统使用CR3存储页表的基地址,即PML4T的物理基地址。x86_64支持多种页面大小:

1)4K页面:使用PML4T,PDPT,PDT和PT 四级页转化表结构; 2)2M页面:使用PML4T,PDPT 和PDT三级页转化表结构; 3)1G 页面:使用PML4T和PDPT二级页表转化结构。 详细的地址转换过程,在下面的linux 系统分页机制实现再阐述。

虚拟地址映射到物理地址的每一个映射叫叫页表实体(page table entry,PTE)。

TLB

translation lookaside buffer,转换旁路缓存。 CPU的MMU使用该缓存存储操作系统最近使用的映射。

转换过程

页表转换

当虚拟地址需要转换到物理地址时,先查询TLB。 如果TLB命中,则返回对应的物理地址,并继续访问物理内存。 如果不命中,则mmu或者TLB缺失处理程序将会去页表查否是否存在该映射。 如果存在,将其写回到TLB。

TTW,translation table walk,转换表漫游。当tlb中不存在虚拟地址和物理地址的转换关系时,通过访问内存中的转换表来获取虚拟地址和物理地址的对应关系。 TT,转换表,一般为多级页表。

缓存

buffer缓存

页缓存

交换分区缓存

硬件缓存

根据使用功能,将页划分为不同的区。

参考

Linux的进程地址空间一,兰新宇
Linux的进程地址空间二,兰新宇
Four-level page tables
Five-level page tables