linuxのメモ

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

アドレッシング - pud_present()

概要

ページアッパーディレクトリが物理メモリ上に存在するか確認する

詳細

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

アドレッシング - pud_large()

概要

ページアッパーディレクトリのページサイズ拡張(PSE)の状態を確認する

詳細

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

  • 2以下
    • 0を返す
  • それ以外
    • pud_val()でページアッパーディレクトリの値を取得し、取得した値の_PAGE_PSE_PAGE_PRESENTの両方のフラグが経っている場合は1をそれ以外は0を返す
    • 各フラグの意味はここを参照して下さい

アドレッシング - pud_offset()

概要

ページアッパーディレクトリのエントリに該当するアドレスを取得する

詳細

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

  • CONFIG_PGTABLE_LEVELSの値が3を超える場合

  • それ以外

    • ページグローバルディレクトリが存在しないため引数で取得したpgd_tのポインタをpud_tのポインタに変換して返す

アドレッシング - pud_index()

概要

仮想アドレスからページグローバルディレクトリのインデックスを取得する

詳細

unsigned long型で表されるaddressPUD_SHIFT分右にシフトた値とPUDのエントリ数であるPTRS_PER_PUDから1を引いた値の論理積を取ることで、ページグローバルディレクトリのインデックスを取得する

アドレッシング - pgd_page_vaddr()

概要

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

詳細

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