图片无法显示,请右键点击新窗口打开图片

BiscuitOS 内存管理之分页大专题订阅入口

图片无法显示,请右键点击新窗口打开图片

在 Linux 里,Linux 内核虚拟区域被划分成不同的区域,内核为有的区域提供了内存分配器,负责区域内虚拟内存的分配和页表映射任务,那么不同的区域采用什么页表完全取决于分配器的和调用者的行为,因此内核虚拟内存映射的页表内容就与这两者有密不可分的关系,那么根据虚拟区域可以按如下分类:

  • 线性映射区: 内核提供的虚拟内存连续,映射的物理内存也连续的区域,该区域由 Buddy 分配器进行管理,在内核启动阶段,内核为线性映射区建立好了页表,对应的物理内存由 Buddy 分配器负责管理,当 Buddy 分配器分配一个物理页的时候,只需简单的线性公式就可以知道其对应的虚拟内存,无需查询页表和额外维护逆向映射.
  • VMALLOC 映射区: 内存提供的虚拟内存连续,映射的物理内存不连续的区域,该区域由 VMALLOC 分配器进行管理. 当使用 VMALLOC 分配内存时,VMALLOC 分配器首先在从 VMALLOC 区域找到一块空闲的虚拟内存,然后从 Buddy 分配器由零散的物理页,然后建立页表将连续的物理页映射到这些零散的物理页上.
  • MMIO 映射区: 内核提供的专门的虚拟区域,用于映射外设映射的 MMIO, 该区域由 IOREMAP 分配器进行管理. 当使用 IOREMAP 分配器映射 MMIO 时,IOREMAP 分配器首先从 MMIO 映射区分配一块空闲的虚拟内存,然后建立页表将虚拟内存映射到 MMIO 上.
  • 固定映射区: 内核存在固定功能的虚拟内存区域,该区域的虚拟内存都是为系统特殊功能提供,该区域有 FIXMAP/Permanent 分配器进行维护,当内核某特殊功能需要内存时,FIXMAP 分配器会从将指定虚拟内存建立页表映射到物理内存上.
  • 临时映射: 内核存在临时映射的区域,这些区域主要满足内核临时的任务需求,该区域由多种分配器管理,例如 KMAP/IOREMAP/MEMREMAP 分配器,这些分配器实现将系统管理的物理内存(OSMEM)、系统预留物理内存(RSVDMEM) 和外设映射的 MMIO 临时映射到内核空间,让内核能够短暂的访问这些物理区域
  • 其他区域: 内核的其他虚拟区域也是有一些机制进行管理,这里不就一一描述.

图片无法显示,请右键点击新窗口打开图片

图片无法显示,请右键点击新窗口打开图片

BiscuitOS 内存管理之分页大专题订阅入口

图片无法显示,请右键点击新窗口打开图片