linuxのメモ

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

アドレッシング - __pud()

概要

pudval_t型の値をpud_t型に変換する

詳細

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

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

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

アドレッシング - __pgd()

概要

pgdval_t型の値をpgd_t型に変換する

詳細

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

  • 有効
    • PVOP_CALLEEx()valが32bitの場合は引数を1つ、64bitモードの場合は第1引数valの下位32bitを、第2引数に上位32bitの2つの値を渡してpv_mmu_ops.make_pgd*1を実行しpgdval_t型の値を取得する
    • 取得した値をpgd_t型の値に変換して返す
  • 無効

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

アドレッシング - pgd_val()

概要

ページグローバルディレクトリの値を返す

詳細

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

  • 有効
    • PVOP_CALLEEx()valが32bitの場合は引数を1つ、64bitモードの場合は第1引数valの下位32bitを、第2引数に上位32bitの2つの値を渡してpv_mmu_ops.pgd_val*1を実行しpgdval_t型の値を返す
  • 無効

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

準仮想化 - PTE_IDENT

概要

受け取った値をそのまま帰す

詳細

__PV_IS_CALLEE_SAVE()に関数名を渡すが、CONFIG_X86_32CONFIG_X86_PAEの値によって引数として渡す関数が変わる