引言

Linux 内核的内存管理是操作系统中最复杂、最核心的子系统之一。它不仅负责物理内存的分配与回收,还要在多个进程之间公平高效地共享有限的内存资源,同时向用户空间提供简洁统一的抽象接口。本文将深入 Linux 内核内存管理的核心机制,从物理页框管理、伙伴系统(Buddy System)、SLAB/SLUB 分配器,到虚拟内存映射、页面置换算法以及 OOM Killer 实战,逐层剖析其设计哲学与实现原理。

一、物理内存模型与页框管理

1.1 统一内存模型(UMA)与非统一内存模型(NUMA)

Linux 内核支持两种物理内存拓扑模型:

  • UMA(Uniform Memory Access):所有 CPU 访问任意物理内存地址的延迟相同,常见于传统 SMP 系统。
  • NUMA(Non-Uniform Memory Access):将内存划分为多个节点(Node),每个 CPU 访问本地节点内存时延最低,跨节点访问时延较高。现代多路服务器普遍采用此架构。

内核使用 pg_data_t 结构描述每个 NUMA 节点,包含该节点的内存域(Zone)列表、起始页帧号(node_start_pfn)和页数(node_present_pages)。在 x86_64 架构下,页面大小通常为 4KB,即一个页框(Page Frame)为 4096 字节。

1.2 内存域(Zone)划分

物理内存按用途被划分为多个域:

  • ZONE_DMA:0~16MB,用于兼容性 DMA 操作的设备缓冲区。
  • ZONE_DMA32:16MB~4GB,支持 32 位 DMA 设备。
  • ZONE_NORMAL:直接映射到内核虚拟地址空间的高端部分,内核可直接访问。
  • ZONE_HIGHMEM(仅 32 位系统):896MB 以上的物理内存,需要动态映射才能被内核访问。
  • ZONE_MOVABLE:内核 2.6.23 引入的可移动内存域,用于内存热插拔,其中的页面可以被迁移。

每个 zone 通过 zone-

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
网站二维码

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部
/* 跳过导航链接 (无障碍) */ position: absolute; top: -100px; left: 15px; z-index: 99999; padding: 8px 16px; background: #007bff; color: #fff; font-size: 14px; border-radius: 0 0 4px 4px; text-decoration: none; transition: top 0.2s; } top: 0; outline: 3px solid #0056b3; }