kernel-memory-management について
Linux カーネルのメモリアロケーター選定とデバッグをエージェント向けに解説するガイドです。物理ページ、SLUB、仮想マッピング、DMA、NUMAを扱い、選択基準と診断手順を示します。
主な機能
- 01DMAやバッファ向けの割り当て方法選定
- 02kmalloc、SLUB、vmalloc、ページ割り当て
- 03GFPフラグと実行コンテキスト
- 04NUMAとメモリーゾーンの基礎
- 05OOMとslabの診断
活用シーン
- 01ドライバーバッファの割り当て方法選定
- 02カーネルのOOMやslab破損の調査
- 03DMA割り当て要件の確認
- 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_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. エージェントの使用方法
/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_coherentskills/allocators/custom-allocators— ユーザー空間アロケーターの設計skills/allocators/numa-programming— NUMA 対応の割り当てskills/runtimes/sanitizers— KASAN との重複