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

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

目录

  • 初识内核线性区

  • 线性映射区原理

    • 线性映射区实现

    • 线性映射区的范围

  • 线性区源码解析

  • 线性区使用场景

    • 查询物理内存是否属于线性映射区

    • 临时映射使用线性映射区场景

    • Buddy 使用线性映射区场景

    • MEMBLOCK 使用线性映射区场景

    • SLAB 使用线性映射区产场景

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


线性映射区原理

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

在 Linux 里,当打开分页(Paging)功能之后,CPU 不能直接访问物理内存,而是直接访问虚拟内存. CPU 访问虚拟内存时,MMU 负责透明的查询虚拟内存对应的页表,以此找到最终的物理内存,如果页表不存在或者权限异常,MMU 就会触发页表故障(缺页异常); 反之页表存在且可以找到物理内存,那么 CPU 可以正常访问虚拟内存. Linux 将虚拟内存划分成两部分,其中位于底部的部分归用户进程使用,而高端部分归内核使用,两者相互不干扰确保系统隔离。在内核虚拟区域存在一块特殊的区域,Linux 将一整块虚拟内存映射到一整块物理内存上,形成了虚拟地址连续和物理地址也连续的区域,因此在这块区域只要获得通过一个线性公式就可以知道虚拟地址对应的物理地址,通过物理地址也可以知道对应的虚拟内存,这个区域称为 线性映射区(Linear Mapping Area).

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

Linux 会将内核虚拟地址空间规划成不同的区域(上图是 X86 4-level 页表内核空间布局),其中将 PAGE_OFFSET 开始的区域设置为线性映射区,其长度与实际物理内存有关,另外不同的硬件架构 PAGE_OFFSET 的值可能有所不同,但对于 Linux 来说 PAGE_OFFSET 之后一定长度的区域就是 线性映射区. 内核一般将线性映射区映射到从 0 开始的物理内存上,也有的架构会映射到指定地址的物理内存上,但这不是重点,这里的映射是需要建立页表的,只是系统一次性把线性区的所有虚拟内存都映射到了连续的物理内存上,因此可以知道线性区的起始地址就对应了这块连续物理地址的首地址,基于这个逻辑,线性区的虚拟地址只要通过一个线性关系就可以知道映射物理内存的信息,而不需要费时去查询页表。同理物理内存也可以通过这个线性关系知道内核虚拟内存映射了它,而不需要通过逆向映射才能知道。

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

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

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