linuxのメモ

Linux kernelの実装を解説していきます (対象ver 4.5)

アドレッシング - pud_page_vaddr()

概要

ページアッパーディレクトリの仮想アドレスを取得する

詳細

CONFIG_PGTABLE_LEVELSの値によって以下のように処理が異なる

アドレッシング - pmd_val()

概要

ページミドルディレクトリの値を返す

詳細

pmd_t型の値valを引数として受け取り、CONFIG_PARAVIRT__PAGETABLE_PMD_FOLDEDCONFIG_PGTABLE_LEVELSの値によって以下のように処理が異なる

  • CONFIG_PARAVIRTが有効でCONFIG_PGTABLE_LEVELSが3以上
    • PVOP_CALLEEx()valが32bitの場合は引数を1つ、64bitモードの場合は第1引数valの下位32bitを、第2引数に上位32bitの2つの値を渡してpv_mmu_ops.pmd_val*1を実行しpmdval_t型の値を返す
  • CONFIG_PARAVIRTが無効で__PAGETABLE_PMD_FOLDEDが有効
  • それ以外

*1:この関数はコンパイル時にPTE_IDENTで初期化される

アドレッシング - pmd_page_vaddr()

概要

ページミドルディレクトリの仮想アドレスを取得する

詳細

pmd_val()でページミドルディレクトリの値を取得し、その値とpmd_pfn_mask()で取得したページミドルディレクトリのマスク値との論理積を求めることでページミドルディレクトリの物理アドレスを算出する

その後、算出した物理アドレス__va()で仮想アドレスに変換する

アドレッシング - pmd_pfn_mask()

概要

ページミドルディレクトリのアドレスマスクを取得する

詳細

native_pmd_val()でページミドルディレクトリの値を取得し、_PAGE_PSEフラグが立っていた場合はPATが有効なためPHYSICAL_PMD_PAGE_MASKを、それ以外の場合はPTE_PFN_MASKを返す

アドレッシング - pud_pfn_mask()

概要

ページアッパーディレクトリのアドレスマスクを取得する

詳細

native_pud_val()でページアッパーディレクトリの値を取得し、_PAGE_PSEフラグが立っていた場合はPATが有効なためPHYSICAL_PUD_PAGE_MASKを、それ以外の場合はPTE_PFN_MASKを返す

ページテーブルエントリ (PTE: Page Table Entry)

概要

ページテーブルエントリ(PTE)のフラグを示すマクロ

詳細

bit番号 マクロ フラグ
0 _PAGE_PRESENT 0: 物理メモリに存在しない
1: 存在する
1 _PAGE_RW 0: R ONLY
1: R/W
2 _PAGE_USER 0: カーネルモード
1: ユーザーモード
3 _PAGE_PWT 0: キャッシュのライトバックが有効
1: 無効
4 _PAGE_PCD 0: ページキャッシュが有効
1: 無効
5 _PAGE_ACCESSED 0: ページアクセス無し
1: アクセス済み
6 _PAGE_DIRTY 0: ページの内容が変更されていない
1: 変更済み
7 _PAGE_PSE, _PAGE_PAT ページ属性テーブル(PAT)で使用
8 _PAGE_GLOBAL 0: グローバルページとして設定する
1: 設定しない
9 _PAGE_SOFTW1, _PAGE_SPECIAL, _PAGE_CPA_TEST ソフトウェア管理フラグ
10 _PAGE_SOFTW2 ソフトウェア管理フラグ
11 _PAGE_HIDDEN, _PAGE_SOFT_DIRTY ソフトウェア管理フラグ

アドレッシング - pgd_none()

概要

ページグローバルディレクトリが無効なアドレスか確認する

詳細

PTRS_PER_PUDCONFIG_PGTABLE_LEVELSの値によって以下のように処理が異なる

  • PTRS_PER_PUDの値が1以上の場合
    • pgd_val()でページグローバルディレクトリのアドレスを取得し、取得したアドレスを__pud()pud_t型の値に変換する
    • 変換した値が無効なアドレスかpud_none()で確認する
    • ページグローバルディレクトリが存在しないためページアッパーディレクトリの存在確認をするようになっている
  • CONFIG_PGTABLE_LEVELSの値が3を超えるている場合
  • それ以外
    • 常に0を返す