虚拟内存系统¶
为了方便管理程序运行时使用的内存空间,
memory management unit(mmu)内存管理单元,辅助操作系统管理内存。
| 内存类型 | 描述 |
|---|---|
| 物理内存 | 实际内存空间 |
| 虚拟内存 | 应用程序可以看到并使用的内存空间 |
内存寻址范围¶
由地址总线范围和数据总线大小决定
例如:
内存地址总线长度20bit,内存单元8bit,则访问2^20 * 8bit的内存空间,即2MB。
内存地址总线长度32bit,内存单元8bit,则访问2^32 * 8bit的内存空间,即4GB。
地址类型¶
| 地址类型 | 描述 |
|---|---|
| 逻辑地址 | 机器语言指令使用的地址,指定一个操作数的地址或一条指令的地址 |
| 线性地址 | 线性地址是一个无符号整数,范围0x00~0xffffffff(ffffffff), 由逻辑地址的 段基址+段偏移计算得到若无分页机制,线性地址即物理地址 |
| 物理地址 | 内存单元的实际地址,用于芯片级内存单元寻址 |
地址转换¶
逻辑地址→线性地址→物理地址,实际转换流程由MMU操作

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

| 类型 | 说明 |
|---|---|
| 页框 | page frame,分页单元把所有的RAM物理内存分成固定长度的页框,长度也是4KB或更大 |
| 页 | 分页单元将线性地址分成以固定长度位单位的组,称为页(page)。页内部连续,映射是以页位基本单位。 |
4级页表¶
x86_64采用四级页表,来管理标准4KB页。
在x64体系中用48位的虚拟寻址
理论上48位地址长度可以管理512TB的地址空间
不过x86_64四级页表只使用了256TB的虚拟地址空间。
详见linux 4级内存页表虚拟地址空间范围
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