仮想メモリ管理におけるユーザ空間ページフォールトの処理メカニズム

ページフォールトの基本概念

CPUがアドレスバスを通じて物理メモリやI/Oデバイスにアクセスする際、実際に発行されるのは仮想アドレスであり、MMU(Memory Management Unit)がこれを物理アドレスに変換する。この変換マッピングが未作成の場合、または書き込み権限が不足している場合、MMUはページフォールト例外を発生させる。

プロセスが仮想アドレス空間にアクセスする際、対応する物理ページフレームとの関連付けが未確立の場合、CPUは自動的にページフォールトを生成し、カーネルがこの例外を処理する必要がある。ページフォールト処理の実装はCPUアーキテクチャによって異なり、カーネルコード内ではアーキテクチャ依存部分に配置される。

ページテーブルとTLBの協調動作

ページテーブルは仮想アドレスと物理アドレスの完全なマッピングを格納するデータ構造である。一方、TLB(Translation Lookaside Buffer)は最近使用されたページテーブルエントリをキャッシュする高速バッファであり、アドレス変換の高速化を図る。

CPUがメモリアクセス要求を発行すると、まずTLBで物理アドレスを検索する。TLBミスの場合のみページテーブルを参照してアドレス変換を行う。この二段階の検索機構により、メモリアクセスの効率が大幅に向上する。

ユーザ空間ページフォールト処理の流れ

ARM64アーキテクチャでは、ページフォールト処理のエントリポイントはdo_translation_fault関数である。仮想アドレスがユーザ空間に属する場合、do_page_fault関数が呼び出され、最終的にhandle_mm_fault関数に処理が委譲される。

static int do_translation_fault(unsigned long virt_addr,
                               unsigned int exception_status,
                               struct pt_regs *registers)
{
    if (virt_addr < USER_SPACE_LIMIT)
        return handle_user_fault(virt_addr, exception_status, registers);
    
    handle_kernel_fault(virt_addr, exception_status, registers);
    return 0;
}

handle_mm_fault関数は、ヒュージページと通常ページの処理を分岐する。通常ページの場合、__handle_mm_fault関数が呼び出され、ページテーブル階層を順に探索しながら処理を行う。

int handle_memory_fault(struct vm_area *vma, unsigned long addr,
                       unsigned int fault_flags)
{
    int result;
    
    update_statistics(PGFAULT_EVENT);
    memory_cgroup_track_event(vma->vm_mm, PGFAULT_EVENT);
    
    if (is_hugepage_range(vma))
        result = process_hugepage_fault(vma->vm_mm, vma, addr, fault_flags);
    else
        result = process_standard_page_fault(vma, addr, fault_flags);
    
    return result;
}

ページフォールトの種類と対応

匿名ページのフォールト

以下の状況で発生する:

  • スタック領域の拡張が必要な場合
  • mallocで確保されたヒープ領域の初回アクセス
  • 匿名メモリマッピングの初回アクセス

これらのケースではdo_anonymous_page関数が処理を行う。

ファイルページのフォールト

以下の状況で発生する:

  • プログラムのコードセグメント/データセグメントの初回アクセス
  • ファイルマッピング領域の初回アクセス

これらのケースではdo_fault関数が処理を行う。

ページフォールト処理の詳細なフロー、書き込み時コピー(Copy-on-Write)の仕組み、カーネルモードでのページフォールト処理などは、更に複雑な処理を必要とする。

タグ: 仮想メモリ ページフォールト MMU TLB arm64

6月15日 21:56 投稿