読者です 読者をやめる 読者になる 読者になる

linuxのメモ

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

アドレッシング - pud_present()

概要 ページアッパーディレクトリが物理メモリ上に存在するか確認する 詳細 CONFIG_PGTABLE_LEVELSの値によって以下のように処理が異なる 2以下 1を返す それ以外 pud_flags()で取得したページアッパーディレクトリのフラグと_PAGE_PRESENTの論理積の結果を…

アドレッシング - pud_flags()

概要 ページアッパーディレクトリに設定されているフラグを取得する 詳細 native_pud_val()で取得したページアッパーディレクトリのアドレスとpud_flags_mask()で取得したページアッパーディレクトリのフラグマスクの論理積を返す

アドレッシング - pud_flags_mask()

概要 ページアッパーディレクトリのフラグマスクを取得する 詳細 pud_pfn_mask()で取得したページアッパーディレクトリのアドレスマスクを反転した値を返すため、アドレス以外のbit値をフラグとして利用できるものとする

アドレッシング - pud_large()

概要 ページアッパーディレクトリのページサイズ拡張(PSE)の状態を確認する 詳細 CONFIG_PGTABLE_LEVELSの値によって以下のように処理が異なる 2以下 0を返す それ以外 pud_val()でページアッパーディレクトリの値を取得し、取得した値の_PAGE_PSEと_PAGE_PR…

アドレッシング - pud_offset()

概要 ページアッパーディレクトリのエントリに該当するアドレスを取得する 詳細 CONFIG_PGTABLE_LEVELSの値によって以下のように処理が異なる CONFIG_PGTABLE_LEVELSの値が3を超える場合 pgd_page_vaddr()で取得したページグローバルディレクトリの仮想アド…

アドレッシング - pud_index()

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

アドレッシング - pgd_page_vaddr()

概要 ページグローバルディレクトリの仮想アドレスを取得する 詳細 CONFIG_PGTABLE_LEVELSの値によって以下のように処理が異なる CONFIG_PGTABLE_LEVELSが3を超える場合 pgd_val()でページグローバルディレクトリの値を取得し、その値とPTE_PFN_MASKの論理積…

アドレッシング - pud_page_vaddr()

概要 ページアッパーディレクトリの仮想アドレスを取得する 詳細 CONFIG_PGTABLE_LEVELSの値によって以下のように処理が異なる CONFIG_PGTABLE_LEVELSが2を超える場合 pud_val()でページアッパーディレクトリの値を取得し、その値とpud_pfn_mask()で取得した…

アドレッシング - pmd_val()

概要 ページミドルディレクトリの値を返す 詳細 pmd_t型の値valを引数として受け取り、CONFIG_PARAVIRTと__PAGETABLE_PMD_FOLDED、CONFIG_PGTABLE_LEVELSの値によって以下のように処理が異なる CONFIG_PARAVIRTが有効でCONFIG_PGTABLE_LEVELSが3以上 PVOP_CA…

アドレッシング - pmd_page_vaddr()

概要 ページミドルディレクトリの仮想アドレスを取得する 詳細 pmd_val()でページミドルディレクトリの値を取得し、その値とpmd_pfn_mask()で取得したページミドルディレクトリのマスク値との論理積を求めることでページミドルディレクトリの物理アドレスを…

アドレッシング - pmd_pfn_mask()

概要 ページミドルディレクトリのアドレスマスクを取得する 詳細 native_pmd_val()でページミドルディレクトリの値を取得し、_PAGE_PSEフラグが立っていた場合はPATが有効なためPHYSICAL_PMD_PAGE_MASKを、それ以外の場合はPTE_PFN_MASKを返す

アドレッシング - pud_pfn_mask()

概要 ページアッパーディレクトリのアドレスマスクを取得する 詳細 native_pud_val()でページアッパーディレクトリの値を取得し、_PAGE_PSEフラグが立っていた場合はPATが有効なためPHYSICAL_PUD_PAGE_MASKを、それ以外の場合はPTE_PFN_MASKを返す

アドレッシング - pgd_none()

概要 ページグローバルディレクトリが無効なアドレスか確認する 詳細 PTRS_PER_PUDとCONFIG_PGTABLE_LEVELSの値によって以下のように処理が異なる PTRS_PER_PUDの値が1以上の場合 pgd_val()でページグローバルディレクトリのアドレスを取得し、取得したアド…

アドレッシング - pud_none()

概要 ページアッパーディレクトリのアドレスが無効なアドレスか確認する 詳細 PTRS_PER_PMDとCONFIG_PGTABLE_LEVELSの値によって以下のように処理が異なる PTRS_PER_PMDの値が1以下の場合 pud_val()でページアッパーディレクトリのアドレスを取得し、取得し…

アドレッシング - pmd_none()

概要 ページミドルディレクトリのアドレスが無効なアドレスか確認する 詳細 native_pmd_val()で取得したページミドルディレクトリの値が0なら1、それ以外の場合は0を返す

アドレッシング - native_pmd_val()

概要 ページミドルディレクトリのアドレスを返す 詳細 CONFIG_PGTABLE_LEVELSの値によって以下のように処理が異なる CONFIG_PGTABLE_LEVELSが2を超える場合 pmd_t型の値をpmdval_t型に変換して返す それ以外 native_pgd_val()でページグローバルディレクトリ…

アドレッシング - __pmd()

概要 pmdval_t型の値をpmd_t型に変換する 詳細 _ CONFIG_PARAVIRTとCONFIG_PGTABLE_LEVELS、__PAGETABLE_PMD_FOLDED_の値によって以下のように処理が異なる CONFIG_PARAVIRTが定義されていてCONFIG_PGTABLE_LEVELSの値が3以上の場合 PVOP_CALLEEx()にvalが32…

アドレッシング - native_make_pmd()

概要 pmdval_t型の値をpmd_t_型に変換する 詳細 pmdval_t型の値valを引数として受け取り、valを値とするpmd_t_型の値を返す

アドレッシング - pud_val()

概要 ページアッパーディレクトリの値を返す 詳細 pud_t型の値valを引数として受け取り、CONFIG_PARAVIRTと__PAGETABLE_PUD_FOLDED、CONFIG_PGTABLE_LEVELSの値によって以下のように処理が異なる CONFIG_PARAVIRTが有効でCONFIG_PGTABLE_LEVELSの値が4 PVOP_…

アドレッシング - native_pud_val()

概要 ページアッパーディレクトリのアドレスを返す 詳細 CONFIG_PGTABLE_LEVELSの値によって以下のように処理が異なる CONFIG_PGTABLE_LEVELSが3を超える場合 pud_t型の値をpudval_t型に変換して返す それ以外 native_pgd_val()でページグローバルディレクト…

アドレッシング - __pud()

概要 pudval_t型の値をpud_t型に変換する 詳細 pudval_t型の値を引数として受け取り、CONFIG_PARAVIRTとCONFIG_PGTABLE_LEVELS、__PAGETABLE_PUD_FOLDEDの値によって以下のように処理が異なる CONFIG_PARAVIRTが定義されていてCONFIG_PGTABLE_LEVELSの値が4…

アドレッシング - native_make_pud()

概要 pmdval_t型の値をpud_t_型に変換する 詳細 pmdval_t型の値valを引数として受け取り、valを値とするpud_t_型の値を返す

アドレッシング - __pgd()

概要 pgdval_t型の値をpgd_t型に変換する 詳細 pgdval_t型の値を引数として受け取り、CONFIG_PARAVIRTの値によって以下のように処理が異なる 有効 PVOP_CALLEEx()にvalが32bitの場合は引数を1つ、64bitモードの場合は第1引数valの下位32bitを、第2引数に上位…

アドレッシング - native_make_pgd()

概要 pgdval_t型の値をpgd_t型に変換する 詳細 pgdval_t型の値valを引数として受け取り、valを値とするpgd_t型の値を返す

アドレッシング - pgd_val()

概要 ページグローバルディレクトリの値を返す 詳細 pgd_t型の値valを引数として受け取り、CONFIG_PARAVIRTの値によって以下のように処理が異なる 有効 PVOP_CALLEEx()にvalが32bitの場合は引数を1つ、64bitモードの場合は第1引数valの下位32bitを、第2引数…

アドレッシング - native_pgd_val()

概要 ページグローバルディレクトリのアドレス返す 詳細 pgd_t型の引数からページグローバルディレクトリのアドレスの値を返す

アドレッシング - is_vmalloc_addr()

概要 アドレスが、vmallocのアドレスの範囲内であるか確認する 詳細 CONFIG_MMUが無効な場合は常に0を返すが、有効な場合は引数として取得したアドレスの値がVMALLOC_STARTからVMALLOC_ENDの範囲内にあるか確認する

アドレッシング - __phys_addr_nodebug()

概要 仮想アドレスを物理アドレスに変換する 詳細 物理アドレスを示す値xを引数として受け取り、CPUが32bitと64bitの場合で以下のように処理が異なる 32bitの場合 xからPAGE_OFFSET*1を引いた値を返す 64bitの場合 xから__START_KERNEL_map*2を引いた値を算…

アドレッシング - pfn_to_page()

概要 ページフレーム番号から該当するページのアドレスを取得する 詳細 __pfn_to_page()のwrapperマクロ

アドレッシング - __pfn_to_page()

概要 ページフレーム番号から該当するページのアドレスを取得する 詳細 このマクロではページフレーム番号を示すpfnを引数として受け取り、カーネルコンフィグオプションによって以下のように処理が異なる(優先度順) CONFIG_FLATMEMが有効 mem_mapで示される…

アドレッシング - __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モードで異なる…