mcpField
K
kernel-memory-management

kernel-memory-management

github.com/mohitmishra786開発269308 回インストール18 週間前に更新
リポジトリ

kernel-memory-management について

Linux カーネルのメモリアロケーター選定とデバッグをエージェント向けに解説するガイドです。物理ページ、SLUB、仮想マッピング、DMA、NUMAを扱い、選択基準と診断手順を示します。

主な機能

  1. 01DMAやバッファ向けの割り当て方法選定
  2. 02kmalloc、SLUB、vmalloc、ページ割り当て
  3. 03GFPフラグと実行コンテキスト
  4. 04NUMAとメモリーゾーンの基礎
  5. 05OOMとslabの診断

活用シーン

  1. 01ドライバーバッファの割り当て方法選定
  2. 02カーネルのOOMやslab破損の調査
  3. 03DMA割り当て要件の確認
  4. 04メモリーとslab統計の確認

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/mohitmishra786/low-level-dev-skills --skill kernel-memory-management

インストール後、Claude Code で/kernel-memory-managementを入力して読み込まれたか確認します。

詳細

カーネルメモリ管理

目的

Linux カーネルのメモリ割り当てについて、物理ページアロケーター(バディ)、SLUB kmalloc キャッシュ、vmalloc 仮想マッピング、ゾーン(DMA/Normal)、ドライバーにおける安全な割り当てパターンをエージェントに案内し、skills/kernel/kernel-internals を拡張します。

使用する場面

  • kmalloc、vmalloc、get_free_pages のどれを選ぶか判断するとき
  • カーネル OOM やスラブ破損をデバッグするとき
  • DMA バッファの割り当て要件を確認するとき
  • /proc/meminfo とスラブ統計を理解するとき

ワークフロー

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. エージェントの使用方法
/kernel-memory-management Choose allocator for 2 MiB driver ring buffer in process context

よくある問題

症状原因対処法
大きな割り当てで kmalloc が失敗するkmalloc の上限を超えているvmalloc またはページを使用する
DMA バッファが不適切ハードウェア DMA に vmalloc を使用したdma_alloc_coherent
OOM キラーが発動するキャッシュが無制限に増加しているプールを制限し、シュリンカーを使用する
スラブ破損解放後使用KASAN を使用し、kfree の対応関係を監査する
IRQ 中に GFP_KERNEL を使用しているアトミックコンテキストでスリープするアロケーターを使用しているGFP_ATOMIC

関連スキル

  • skills/kernel/kernel-internals — ページキャッシュ、OOM キラー
  • skills/kernel/device-drivers — dma_alloc_coherent
  • skills/allocators/custom-allocators — ユーザー空間アロケーターの設計
  • skills/allocators/numa-programming — NUMA 対応の割り当て
  • skills/runtimes/sanitizers — KASAN との重複

コメント