关于 kernel-memory-management
面向 Agent 的 Linux 内核内存分配指南,涵盖物理页、SLUB、虚拟映射、DMA 和 NUMA。内容结合分配器选择、使用模式与诊断命令。
主要功能
- 01为 DMA 和缓冲区选择分配器
- 02kmalloc、SLUB、vmalloc 与页分配
- 03GFP 标志与执行上下文
- 04NUMA 与内存区域基础
- 05OOM 与 slab 诊断
适用场景
- 01为驱动缓冲区选择分配方式
- 02排查内核 OOM 或 slab 损坏
- 03核对 DMA 分配要求
- 04检查内存与 slab 统计
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ mohitmishra786/ low-level-dev-skills --skill kernel-memory-management安装后在 Claude Code 中输入/kernel-memory-management确认已加载。
详细介绍
内核内存管理
目的
指导 Agent 进行 Linux 内核内存分配:物理页分配器(伙伴系统)、SLUB kmalloc 缓存、vmalloc 虚拟映射、内存区域(DMA/Normal),以及驱动中的安全分配模式——扩展 skills/kernel/kernel-internals。
适用场景
- 选择
kmalloc、vmalloc还是get_free_pages - 调试内核 OOM 或 slab 损坏
- 了解 DMA 缓冲区分配要求
- 理解
/proc/meminfo和 slab 统计信息
工作流
1. 分配器决策树
Need physically contiguous memory for DMA?
├── Yes → dma_alloc_coherent() or CMA pool
└── No
├── Size ≤ ~128K (arch-dependent) → kmalloc / kzalloc
├── Large or non-contiguous OK → vmalloc / vzalloc
└── Whole pages → alloc_pages() / __get_free_pages()
2. kmalloc 和 SLUB
SLUB 是默认的通用 kmalloc 后端(参见内核内存分配指南);旧版 SLAB 分配器已在 Linux 6.12 中移除。
void *buf = kmalloc(size, GFP_KERNEL);
if (!buf)
return -ENOMEM;
/* ... */
kfree(buf);
| GFP 标志 | 上下文 |
|---|---|
GFP_KERNEL | 进程上下文,可以休眠 |
GFP_ATOMIC | IRQ / 持有自旋锁时——使用较小的内存池 |
GFP_DMA | DMA 内存区域(旧版 32 位设备) |
检查 /proc/slabinfo 和 cat /sys/kernel/slab/*/object_size。
3. vmalloc
void *v = vmalloc(size); /* virtually contiguous, physically scattered */
vfree(v);
用于不需要物理页连续的大型缓冲区。未使用 dma_map_* 时,不要将其用于 DMA。
4. 伙伴页分配器
struct page *page = alloc_pages(GFP_KERNEL, order);
void *addr = page_address(page);
__free_pages(page, order);
order n 会分配 2^n 个页面。内存区域选择:ZONE_DMA、ZONE_NORMAL、ZONE_MOVABLE(参见 include/linux/mmzone.h)。
5. NUMA 基础知识
在 NUMA 系统上,kmalloc 优先使用本地节点;对于 HPC 路径,使用 alloc_pages_node() 或 mbind 策略——参见 skills/allocators/numa-programming。
6. 调试
cat /proc/meminfo
cat /proc/slabinfo
dmesg | grep -i oom
内核配置:使用 CONFIG_SLUB_DEBUG、CONFIG_KASAN 检查释放后使用问题。
7. Agent 使用方法
/kernel-memory-management Choose allocator for 2 MiB driver ring buffer in process context
常见问题
| 症状 | 原因 | 修复方法 |
|---|---|---|
大块 kmalloc 失败 | 超出 kmalloc 限制 | 使用 vmalloc 或页面 |
| DMA 缓冲区不正确 | 将 vmalloc 用于硬件 DMA | 使用 dma_alloc_coherent |
| OOM killer 触发 | 缓存无界增长 | 限制内存池;使用 shrinker |
| Slab 损坏 | 释放后使用 | 使用 KASAN;检查 kfree 配对情况 |
在 IRQ 中使用 GFP_KERNEL | 原子上下文中使用了会休眠的分配器 | 使用 GFP_ATOMIC |
相关技能
skills/kernel/kernel-internals— 页缓存、OOM killerskills/kernel/device-drivers—dma_alloc_coherentskills/allocators/custom-allocators— 用户空间分配器设计skills/allocators/numa-programming— NUMA 感知分配skills/runtimes/sanitizers— KASAN 相关内容
评论
支持 Markdown