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

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

目录

  • 虚拟内存导论

  • 应用程序虚拟地址空间

  • 应用程序虚拟内存分配方式

    • PreAlloc 预分配机制

    • LazyAlloc 惰性分配机制

    • OnDemand 按需分配机制

  • 应用程序虚拟内存分类

    • 匿名内存: Anonymous Memory

    • 共享内存: Shared Memory

    • 文件映射内存: File-Mapped Memory(PageCACHE)

    • PFNMAP 映射内存

    • MMIO 映射内存

    • THP 透明大页内存

    • HugeTLB 大页内存

    • DAX-Mapping 映射内存

  • 内核虚拟地址空间

    • Linear Mapping Area on Paging

    • VMALLOC on Paging

    • MMIO 映射区 on Paging

    • Temporary Mapping Paging

    • Permanent Mapping with Paging

    • Early IO/RSVD-MEM with Paging

    • PFN Direct Mapping(PFNMAP) on Paging

    • FIXMAP on Paging

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


虚拟内存导论

计算机硬件架构中存在一种硬件 MMU(Memory Management Unit), 通常称为内存管理单元,有时也称为分页内存管理单元 PMMU(Paged memory management unit), 负责处理 CPU 内存访问请求的计算机硬件。MMU 主要包含: 虚实地址翻译访问权限控制。另外在计算机中存在实时模式和保护模式,当 CPU 处在实时模式下,CPU 看到的内存就是地址总线上的物理内存,那么 CPU 可以直接访问物理内存; 当计算机开启保护模式,MMU 分页功能便随之启动,此时 CPU 看到的内存是一块连续的线性空间,那么称这块空间为虚拟内存, CPU 访问虚拟内存的地址称为虚拟地址。虚拟内存的大小与计算机的位宽有关,例如 32 位系统虚拟内存的范围是 [0, 4G), 而 64 位系统虚拟内存的范围是 [0, 2^64). 虚拟内存的特点就是连续且范围巨大。

系统将虚拟内存划分成两个区域,用户进程使用的虚拟内存区域称为用户空间(Userspace), 内核使用的虚拟内存区域称为内核空间(Kernel Space), 由于 MMU 的存在,用户进程访问内核空间或者内核访问用户空间都会引起系统错误。在不同架构中两个区域的大小划分有所不同:

在 IA32 架构中,32 位地址总线的寻址能力为 [0, 4G), 内核将虚拟内存从 PAGE_OFFSET 处分作两部分,[0, PAGE_OFFSET) 为用户进程所使用的虚拟内存,而 [PAGE_OFFSET, 4G) 为内核使用的虚拟内存。PAGE_OFFSET 可能是 2G 或者 3G,经典的分割是 [0,3G) 是用户空间 [3G, 4G) 为内核空间.

在当前 AMD64/X64 架构中 64 位虚拟地址仅实现 48 位,剩下的高 16 位仅仅是作为符号拓展,组成最终的 64 位虚拟地址。高 16 位称为 Sign Extension 域,而低 48 位称为线性地址域,这样的 64 位虚拟地址称为 canonical-address 地址形式。Sign Extension 域要么全为 1 或者 0,对于 Sign Extension 不全为 0 或 1 的地址称为 Noncanonical-address.

当前 AMD64/X64 架构中 Sign Extension 域为 16 位,那么虚拟内存会分作三部分,当 Sign Extension 全为 0 的区域称为 Canonical “Lower half”, 也就是用户空间,128TiB 用户空间 [0, 0x00007fff ffffffff) 占据了虚拟内存的底部. Sign Extension 全为 1 的区域称为 Canonical “High half”, 也就是内核空间,128TiB 内核空间 [0xffff8000 00000000, 0xffffffff ffffffff) 占据了虚拟内存顶部的位置。Sign Extension 域不全为 0 或 1 的范围 [0x00008000 0000000, 0xffff8000 00000000) 称为 Noncanonical Address Space, 落在这个区域的虚拟地址都是非法地址.

随着技术的不断发展,AMD64/X64 64 位虚拟地址可以实现 56 根或者 64 根都能寻址,那么虚拟内存的 Canonical 区域的 Lower HalfHigher Half 将像 IA32 架构一样链接在一起,那么系统的内核空间和用户空间的范围将大大增加.

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

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

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