物理内存管理

tags:: linux, kernel, mm

[TOC]

体系结构

内存模型

内存模型:

  • 平坦内存(Flat Memory):内存的物理地址连续
  • 不连续内存(Discontiguous Memory):内存的物理地址空间存在空洞,可以高效处理空洞
  • 稀疏内存(Sparse Memory):内存的物理地址空间存在空洞,支持内存热拔插

出现空洞的原因:

  • 多块物理内存
  • 一块内存也可能存在空洞

为什么需要多个内存模型:

平坦内存会为空洞分配page结构体,会浪费内存;不连续内存可以高效处理空洞;稀疏内存可以支持内存热插拔。

内存管理三级结构

节点(node)、区域(zone)和页(page)

内存节点(node)

  • NUMA 系统的内存节点,根据处理器和内存的距离划分
  • 在具有不连续内存的 UMA 系统中,根据物理地址是否连续划分,每块物理地址连续的内存是一个内存节点

内存节点使用一个pglist_data结构体描述内存布局

内存区域(zone)

内存区域类型:

  • ZONE_DMA
  • ZONE_DMA32
  • ZONE_NORMAL
  • ZONE_HIGHMEM
  • ZONE_MOVABLE
  • ZONE_DEVICE

物理页(page)

  • 每个物理页对应一个 page 结构体,称为页描述符
  • 在系统启动时会初始化所有物理页对应的 page

物理内存管理_2021-09-30-10.36.38.excalidraw

  • SECTION:稀疏内存模型的段编号
  • NODE:节点编号
  • ZONE:区域类型
  • FLAGS:标志位

伙伴分配器

内核初始化后,使用页分配器管理物理页,当前使用的页分配器是伙伴分配器,该算法简单且高效。

基本概念

  • 页块(page block):连续的物理页
  • 阶(order):页的数量单位,个连续页称为 阶页块
  • 伙伴(buddy):满足以下条件的两个阶页块
    • 两个页块相邻,即物理地址连续
    • 页块的第一页的物理页号是的整数倍
    • 如果合成为(n+1)阶页块,第一页的物理页必须是的整数倍
  • 每个分区有其独享的伙伴分配器

分配算法

伙伴分配器分配和释放物理页的数量单位是阶。

分配阶页块的过程可以分为查找阶空闲页块,分配阶空闲页块两个步骤:

查找阶空闲页块过程如下:

查看是否有空闲的阶页块:

  • 如果有,则直接返回该空闲阶页块
  • 如果没有,则递归查找空闲阶页块,并将阶页块分裂成两个阶页块,一个插入到空闲阶页块链表,一个返回。

释放阶页块过程:

查看其伙伴是否空闲:

  • 如果伙伴不空闲,则插入到空闲阶页块链表
  • 如果伙伴空闲,则合并成阶页块,并释放阶页块。

Reference