mcpField
V
virtual-memory-paging-and-tlb

virtual-memory-paging-and-tlb

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

virtual-memory-paging-and-tlb について

OS、組み込みシステム、性能分析に携わる開発者向けのシステムスキルです。アドレス変換、ページテーブル、TLB、ページフォルトに加え、MMU によるページングと Cortex-M の MPU の違いを解説します。

主な機能

  1. 01仮想アドレスから物理アドレスへの変換
  2. 02多段ページテーブルの解説
  3. 03ページフォルトの種類と原因
  4. 04TLB 圧迫と緩和策
  5. 05Cortex-M MPU との比較
  6. 06Linux のメモリ確認コマンド

活用シーン

  1. 01mmap ワークロードのデマンドページング理解
  2. 02セグメンテーションフォルトやガードページの調査
  3. 03TLB 圧迫と巨大ページの検討
  4. 04組み込み MPU と MMU の比較

インストール

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

$npx skills add https://github.com/mohitmishra786/low-level-dev-skills --skill virtual-memory-paging-and-tlb

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

詳細

仮想メモリ、ページング、TLB

目的

仮想メモリについて説明します。ページング、マルチレベルページテーブル、TLB の役割、ページフォルト、アドレス変換を取り上げ、OS カーネル、組み込み MPU、パフォーマンス分析をつなぎます。

使用する場面

  • mmap、brk、デマンドページングについて理解するとき
  • セグメンテーションフォルトやガードページをデバッグするとき
  • Huge page や TLB 負荷を調整するとき
  • Cortex-M MPU とフル MMU システムを比較するとき

ワークフロー

1. 変換の概要
Virtual address (VA)
├── TLB lookup → physical on hit
└── TLB miss → page table walk → fill TLB
        ├── valid PTE → physical address
        └── invalid → page fault (OS handles)
2. ページテーブル(x86-64 の 4 レベルの例)
CR3 → PML4 → PDPT → PD → PT → physical frame

x86_64 上の Linux では、デフォルトで 4 KiB ページを使用し、オプションで 2 MiB/1 GiB の Huge page を使用できます。

3. ページフォルトの種類(簡易版)
フォルト典型的な原因
メジャーディスク読み込み — ファイルバックのページが RAM にない
マイナーゼロフィルまたは COW の分離
保護カーネルページへのユーザーアクセス、W^X 違反
# Linux page fault stats
grep pgfault /proc/vmstat
4. TLB 負荷

大規模で疎なアドレス空間でランダムにポインターをたどると、TLB ミスが支配的になります。

緩和策:

  • Huge page の mmap(MAP_HUGETLB、madvise(MADV_HUGEPAGE))
  • ワーキングセットを小さくする/局所性を高める
  • NUMA では numactl --membind
5. 組み込みとの比較(Cortex-M)

多くの MCU はフルページングではなく、領域ベースの MPU を使用します。TLB はなく、領域数も固定です。アプリケーションプロセッサは MMU と OS を使用します。

Sv39/Sv48 については skills/platform/riscv-privileged を参照してください。

6. ユーザー空間からの確認(Linux)
cat /proc/self/maps
pmap -x $$
7. エージェントの使用方法
/virtual-memory-paging-and-tlb Explain why 4 KiB random access hurts TLB and hugepage helps

よくある問題

症状原因解決策
セグメンテーションフォルトマッピングされていない VAポインターを修正し、maps を確認する
mmap ワークロードが遅いTLB スラッシングHuge page を使う。領域数を減らす
fork 後の COW スパイク書き込み時に共有ページが分割される想定どおりです。MAP_POPULATE を検討してください
W^X フォルトmprotect の切り替えを行わない JITRW と RX のマッピングを分ける
MCU で物理アドレスが誤っているMMU がなく、リニアマッピングになっているリンカースクリプトのアドレスを使用する

関連スキル

  • skills/computer-architecture/memory-hierarchy-and-caches — 変換後のキャッシュ
  • skills/kernel-dev/kernel-memory-management — カーネルのページアロケーター
  • skills/kernel/os-dev-scratch — ページングをゼロから構築する
  • skills/platform/riscv-privileged — Sv39 ページテーブル
  • skills/allocators/numa-programming — NUMA と移行

コメント