虚拟内存
应用程序在运行时使用虚拟内存,CPU负责将虚拟地址翻译成物理地址,操作系统负责设置虚拟地址和物理地址之间的映射
虚拟地址和物理地址
- 内存管理单元(MMU, Memory Management Unit)
- 转址旁路缓存(TLB, Translation Lookaside Buffer)
分段与分页机制
AArch64架构下的4级页表
为什么使用多级页表?
多级页表的设计极大减少了页表占用的空间大小
多级页表允许在整个页表结构中出现空洞,而单击页表则需要每一项都实际存在
单级页表可以看做以虚拟地址的虚拟页号为索引的数组,整个数组的起始地址(物理地址)存储在页表基地址寄存器(TTBR0_EL1)中。
- 基本设置
- 虚拟地址低48位参与地址翻译
- 页表级数为4级
- 虚拟页大小为4KB(2^12)
- 一个页表项大小等于一个物理页的大小:8B(2^3)
- 第12位对应页内偏移量
- 0级页表有且仅由一个页表页
- 其余每一级页表拥有若干个离散的页表页,(4KB / 8B = 512 个 ,2^9),故每一级页表的索引需要9位。
- 地址划分:48 = 9 + 9 + 9 + 9 + 12
TLB
- TLB理解为简单的哈希表,键是虚拟页号,值是物理页号
- AArch64 Cortex-A72 CPU中,每个CPU核心只有约一千条TLB缓存项
TLB刷新- 当从应用程序A切换到应用程序B时,A和B使用了同样的虚拟地址VA,但是对应不同的物理地址PA1和PA2,那么尽管操作系统更新了页表基地址,但是TLB命中不会走页表,所以在进行页表切换时,也必须主动刷新TLB。
页替换策略
MIN策略/OPT策略(最优策略)
- 优先选择未来不会再访问的页,或者在最长时间内不会再访问的页。
FIFO策略
- 先进先出
- 会产生Belady异常
- 更多的可用物理内存页会导致更多的换页
Second Chance策略
- FIFO改进版
LRU
- Least Recently Used 选择最久未被访问的页
虚拟内存的功能
共享内存
- 共享内存的一个基本用途是可以让不同的应用程序之间互相通信、传递数据。
- 基于共享内存,衍生出:
- 写时拷贝
- 内存去重
- 内存压缩
物理内存分配器
伙伴系统
-
基本思想
将物理内存划分为连续的块,以块为基本单位进行划分。每个块都由一个或多个连续的物理页组成,物理页的数量必须是2的n次幂。
-
伙伴系统的最小分配单位是一个页(4KB)
-
基本操作:
- 分裂:
大的快可以分裂成两半,这两个互为伙伴 - 合并:
一个块被释放后,可以和伙伴合并
- 分裂:
-
实际应用中,使用空闲链表数组去实现伙伴系统
SLAB分配器
- 基本思想
ChCore内存管理机制
- 三个重要的数据结构
- 虚拟地址空间:struct vmspace
- 虚拟地址区域:struct vmregion
- 物理内存对象:struct pmobject
- 关系:
- 一个虚拟地址空间由多个虚拟地址区域组成(链表结构)
- 一个虚拟地址区域关联一个物理内存对象(指针)
- 一个物理内存对象是一些物理内存页的集合(应该是连续的,暂不确定)