linuxのメモ

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

paravirt

準仮想化 - PTE_IDENT

概要 受け取った値をそのまま帰す 詳細 __PV_IS_CALLEE_SAVE()に関数名を渡すが、CONFIG_X86_32とCONFIG_X86_PAEの値によって引数として渡す関数が変わる CONFIG_X86_32が有効でCONFIG_X86_PAEが無効な場合(PAEが有効でないただの32bitモードの場合) _paravi…

準仮想化 - _paravirt_ident_x()

概要 受け取った値をそのまま返す 詳細 32bitモードの場合はu32型、それ以外の場合はu64型の引数の値を受け取り、値をそのまま返す関数 struct pv_mmu_ops構造体のメソッドとして使用されるため関数として定義されているものと思われる

順仮想化 - __PV_IS_CALLEE_SAVE()

概要 任意の関数でstruct paravirt_callee_save型の変数を初期化する 詳細 関数名を引数として受け取り、struct paravirt_callee_save型のfuncメンバに関数のポインタを代入して初期化する

準仮想化 - PVOP_CALL_ARGx()

概要 拡張インラインアセンブラで使用可能な引数を指定する命令を生成する 詳細 PVOP_CALL_ARG1、PVOP_CALL_ARG2、PVOP_CALL_ARG3、PVOP_CALL_ARG4のいずれかに該当し以下の処理を行う 引数の値をunsigned long型にキャストし、適切なレジスタに割り当てる拡…

準仮想化 - PVOP_CALLEEx()

概要 準仮想環境下で実行される命令の置き換え、及び実行するための命令を生成し、実行した値を取得する 詳細 PVOP_CALLEE0、PVOP_CALLEE1、PVOP_CALLEE2のいずれかに該当し以下の処理を行う 返り値の型を示すrettypeと実行する命令が含まれる構造体op_を引…

準仮想化 - __PVOP_CALLEESAVE()

概要 準仮想環境下で実行される命令の置き換え、及び実行するための命令を生成し、実行した値を取得する 詳細 このマクロでは以下の引数を受け取る 取得する値の型を示す : rettype 実行する命令が含まれる構造体 : op 生成されるアセンブラ命令の前に実行す…

準仮想化 - ____PVOP_CALL()

概要 準仮想環境下で実行される命令の置き換え、及び実行するための命令を生成し、実行した値を取得する 詳細 このマクロでは以下の引数を受け取る 取得する値の型を示す : rettype 実行する命令のポインタを示す : op 命令内で使用するレジスタの種類を示す…

準仮想化 - PVOP_VCALLEE0()

概要 準仮想環境下で実行される命令の置き換え、及び実行するための命令を生成する 詳細 実行する命令が含まれる構造体opを引数として受け取り、以下の引数を__PVOP_VCALLEESAVE()に渡して実行し、準仮想環境下で実行される命令を生成する 実行する命令を含…

準仮想化 - __PVOP_VCALLEESAVE()

概要 準仮想環境下で実行される命令の置き換え、及び実行するための命令を生成する 詳細 このマクロでは以下の引数を受け取る 実行する命令が含まれる構造体 : op 生成されるアセンブラ命令の前に実行する命令を示すアセンブラ命令の文字列 : pre 生成される…

準仮想化 - __PVOP_VCALL()

概要 準仮想環境下で実行される命令の置き換え、及び実行するための命令を生成する 詳細 このマクロでは以下の引数を受け取る 実行する命令のポインタを示す : op 生成されるアセンブラ命令の前に実行する命令を示すアセンブラ命令の文字列 : pre 生成される…

準仮想化 - ____PVOP_VCALL()

概要 準仮想環境下で実行される命令の置き換え、及び実行するための命令を生成する 詳細 このマクロでは以下の引数を受け取る 実行する命令のポインタを示す : op 命令内で使用するレジスタの種類を示す : clbr アセンブラ命令の出力引数として指定する引数…

準仮想化 - PVOP_TEST_NULL()

概要 引数の値が有効な値か確認する 詳細 CONFIG_PARAVIRT_DEBUGが有効な場合は引数の値とNULLを比較してBUG_ON()を実行するが、無効な場合は何もしない

準仮想化 - paravirt_alt()

概要 準仮想環境下で実行される命令の置き換え、及び実行するためのアセンブラ命令を生成する 詳細 _paravirt_alt()に以下の引数を渡してアセンブラ命令を生成する 引数として渡された実行する命令を示す文字列 入力オペランドとして渡される置き換える命令…

準仮想化 - _paravirt_alt()

概要 準仮想環境下で実行される命令の置き換え、及び実行するためのアセンブラ命令を生成する 詳細 このマクロでは以下の引数を取得する 挿入する命令を示す文字列 : insn_string 挿入する命令の種類を示す : type 使用するレジスタの種類を示す : clobber i…

準仮想化 - paravirt_clobber()

概要 インラインアセンブラのオペランドを定義する 詳細 アセンブラのオペランドとして以下の名前と値を定義する 名前 値 [paravirt_clobber] 引数で取得した値を割り当てる

準仮想化 - paravirt_type()

概要 インラインアセンブラのオペランドを定義する 詳細 アセンブラのオペランドとして以下の名前と値を定義する 名前 値 [paravirt_typenum] PARAVIRT_PATCH()で取得した値を割り当てる [paravirt_opptr] 引数で取得した値のアドレスを割り当てる

準仮想化 - PARAVIRT_PATCH()

概要 paravirt_patch_template構造体のメンバを示すindexを取得する 詳細 offsetof()でparavirt_patch_template構造体のメンバのoffset値を取得し、この値をvoidのサイズで割ることで指定したメンバのindexを得る