linuxのメモ

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

アドレッシング - __pfn_to_page()

概要

ページフレーム番号から該当するページのアドレスを取得する

詳細

このマクロではページフレーム番号を示すpfnを引数として受け取り、カーネルコンフィグオプションによって以下のように処理が異なる(優先度順)

  • CONFIG_FLATMEMが有効
    • mem_mapで示されるページデータの開始アドレスにページフレーム番号からARCH_PFN_OFFSETを引いた値を加算したアドレスを返す
  • CONFIG_DISCONTIGMEMが有効
    • arch_pfn_to_nid()pfnからノード番号を取得し、NODE_DATA()でノード番号に対応するノードデータを取得する
    • arch_local_page_offset()pfnに対応するノード内のアドレスのオフセットを取得し、ノードデータのnode_mem_mapにオフセット値を加算したアドレスを返す
  • CONFIG_SPARSEMEM_VMEMMAPが有効
    • vmemmapで示されるページデータの開始アドレスにpfnを加算したアドレスを返す
  • CONFIG_SPARSEMEMが有効 *__pfn_to_section()pfnからセクションデータを取得し、セクションデータから__section_mem_map_addr()でページの開始アドレスを取得し、ページデータにpfn_を加算したアドレスを返す