现代操作系统 原理与实现(银杏书)—— 内存管理

虚拟内存

应用程序在运行时使用虚拟内存,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内存管理机制

  • 三个重要的数据结构
  1. 虚拟地址空间:struct vmspace
  2. 虚拟地址区域:struct vmregion
  3. 物理内存对象:struct pmobject
  • 关系:
    • 一个虚拟地址空间由多个虚拟地址区域组成(链表结构)
    • 一个虚拟地址区域关联一个物理内存对象(指针)
    • 一个物理内存对象是一些物理内存页的集合(应该是连续的,暂不确定)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值