linuxのメモ

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

アドレッシング - pud_none()

概要

ページアッパーディレクトリのアドレスが無効なアドレスか確認する

詳細

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

  • PTRS_PER_PMDの値が1以下の場合
    • pud_val()でページアッパーディレクトリのアドレスを取得し、取得したアドレスを__pmd()pmd_t型の値に変換する
    • 変換した値が無効なアドレスかpmd_none()で確認する
    • ページアッパーディレクトリが存在しないためページミドルディレクトリの存在確認をするようになっている
  • CONFIG_PGTABLE_LEVELSの値が2を超えるている場合
  • それ以外
    • 常に0を返す

アドレッシング - native_pmd_val()

概要

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

詳細

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

  • CONFIG_PGTABLE_LEVELSが2を超える場合
    • pmd_t型の値をpmdval_t型に変換して返す
  • それ以外

アドレッシング - __pmd()

概要

pmdval_t型の値をpmd_t型に変換する

詳細

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

  • CONFIG_PARAVIRTが定義されていてCONFIG_PGTABLE_LEVELSの値が3以上の場合
    • PVOP_CALLEEx()valが32bitの場合は引数を1つ、64bitモードの場合は第1引数valの下位32bitを、第2引数に上位32bitの2つの値を渡してpv_mmu_ops.make_pmd*1を実行しpmdval_t型の値を取得する
    • 取得した値をpmd_t型の値に変換して返す
  • CONFIG_PARAVIRT__PAGETABLE_PMD_FOLDEDが未定義の場合
  • 上記以外の場合
    • __pud()valpud_t型に変換した値をpmd_t型に変換して返す

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

アドレッシング - pud_val()

概要

ページアッパーディレクトリの値を返す

詳細

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

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

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

アドレッシング - native_pud_val()

概要

ページアッパーディレクトリのアドレスを返す

詳細

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

  • CONFIG_PGTABLE_LEVELSが3を超える場合
    • pud_t型の値をpudval_t型に変換して返す
  • それ以外