mcpField
K
kernel-memory-management

kernel-memory-management

github.com/mohitmishra786开发269308 次安装18 周前更新
代码仓库

关于 kernel-memory-management

面向 Agent 的 Linux 内核内存分配指南,涵盖物理页、SLUB、虚拟映射、DMA 和 NUMA。内容结合分配器选择、使用模式与诊断命令。

主要功能

  1. 01为 DMA 和缓冲区选择分配器
  2. 02kmalloc、SLUB、vmalloc 与页分配
  3. 03GFP 标志与执行上下文
  4. 04NUMA 与内存区域基础
  5. 05OOM 与 slab 诊断

适用场景

  1. 01为驱动缓冲区选择分配方式
  2. 02排查内核 OOM 或 slab 损坏
  3. 03核对 DMA 分配要求
  4. 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_ATOMICIRQ / 持有自旋锁时——使用较小的内存池
GFP_DMADMA 内存区域(旧版 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 killer
  • skills/kernel/device-drivers — dma_alloc_coherent
  • skills/allocators/custom-allocators — 用户空间分配器设计
  • skills/allocators/numa-programming — NUMA 感知分配
  • skills/runtimes/sanitizers — KASAN 相关内容

评论

支持 Markdown