linuxのメモ

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

アドレッシング - __phys_addr_nodebug()

概要

仮想アドレスを物理アドレスに変換する

詳細

物理アドレスを示す値xを引数として受け取り、CPUが32bitと64bitの場合で以下のように処理が異なる

  • 32bitの場合
    • xからPAGE_OFFSET*1を引いた値を返す
  • 64bitの場合
    • xから__START_KERNEL_map*2を引いた値を算出する
    • 算出した値が元の値より小さい(xがダイレクトマッピングされたカーネルアドレス空間を示している)場合は算出した値にphys_baseを加算した値を、それ以外の場合は元の値からPAGE_OFFSETを引いた値を返す

*1:仮想アドレスへのオフセット値を示し、32bitの場合初期値は0、64bitの場合は0xffff880000000000となる

*2:カーネルが配置される論理アドレスの開始アドレスを示し、有効な物理アドレスの最終番地まで2GBの地点