linuxのメモ

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

ユーティリティー - unreachable()

概要

呼び出し元のコードに従って適切な返り値を設定する

詳細

GCCのバージョンが4.5以上の場合はコンパイラに組み込まれた_builtin_unreachable()関数を実行し呼び出し元のコードに従って適切な返り値を設定するが、それ以外の場合は何も実行しないマクロとして定義される

アドレッシング - __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_を加算したアドレスを返す

アドレッシング - __section_mem_map_addr()

概要

セクションのデータからページのデータへのアドレスを取得する

詳細

引数で受け取ったstruct mem_section型のセクションのデータからsection_mem_mapメンバの値を取得する

取得した値とSECTION_MAP_MASK論理積で算出されるアドレスをページのデータが保持されるアドレスとみなしstruct page型のポインタとして値を返す

アドレッシング - __pfn_to_section()

概要

ページフレーム番号からセクションのデータを取得する

詳細

pfn_to_section_nr()でページフレームからセクション番号を取得し、__nr_to_section()でセクション番号からセクションのデータを取得する

アドレッシング - __nr_to_section()

概要

セクション番号に一致するセクションのデータを取得する

詳細

SECTION_NR_TO_ROOT()にセクション番号を渡して取得したインデックスがmem_section配列で無効な値の場合はNULLを返す

それ以外の場合は二次元配列であるmem_sectionから取得したインデックスの要素から、更にセクション番号とSECTION_ROOT_MASK論理積で算出される値番目のセクションのデータを取得する