linuxのメモ

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

address

アドレッシング - __section_mem_map_addr()

概要 セクションのデータからページのデータへのアドレスを取得する 詳細 引数で受け取ったstruct mem_section型のセクションのデータからsection_mem_mapメンバの値を取得する 取得した値とSECTION_MAP_MASKの論理積で算出されるアドレスをページのデータが…

アドレッシング - __pfn_to_section()

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

アドレッシング - __nr_to_section()

概要 セクション番号に一致するセクションのデータを取得する 詳細 SECTION_NR_TO_ROOT()にセクション番号を渡して取得したインデックスがmem_section配列で無効な値の場合はNULLを返す それ以外の場合は二次元配列であるmem_sectionから取得したインデック…

アドレッシング - SECTION_NR_TO_ROOT()

概要 セクションのルート番号を取得する 詳細 セクション番号をSECTIONS_PER_ROOTで割ることでセクションが含まれるルート番号を取得する

アドレッシング - pfn_to_section_nr()

概要 ページフレーム番号からセクション番号を取得する 詳細 ページフレーム番号をPFN_SECTION_SHIFTビット右にシフトし、セクション番号を取得する

アドレッシング - arch_local_page_offset()

概要 ノード内のページのオフセット値を取得する 詳細 このマクロでは以下の引数を受け取る ページフレーム番号を示す : pfn ノード番号を示す : nid NODE_DATA()にnidを渡してノードのデータを取得する 取得したデータのnode_start_pfnのメンバをpfnの値か…

アドレッシング - __va()

概要 物理アドレスを仮想アドレスに変換する 詳細 取得した物理アドレスを示す値にPAGE_OFFSETを加算して仮想アドレスに変換する PAGE_OFFSETから64TBのアドレス範囲は物理アドレスのマッピングを管理するアドレス空間になっているため、上記の操作で物理ア…

アドレッシング - phys_to_virt()

概要 物理アドレスを仮想アドレスに変換する 詳細 __va()マクロのwrapper

アドレッシング - is_ISA_range()

概要 アドレスの範囲がISAのアドレス範囲内にあるか確認する 詳細 開始アドレスと終了アドレスを引数として取得し、開始アドレスがISA_START_ADDRESSより大きく、終了アドレスがISA_END_ADDRESSより小さければ1を返し、それ以外の場合は0を返す

アドレッシング - phys_addr_valid()

概要 有効な物理アドレスを示すアドレスか確認する 詳細 CONFIG_PHYS_ADDR_T_64BITが無効な場合は常に有効なアドレスと判断されるが、MAX_PHYSMEM_BITS*1以上のbitが立っていない場合のみ有効となる *1:この値は32bitモードとPAEモード、64bitモードで異なる…