linuxのメモ

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

バッファ操作 - rb_list_head()

概要 struct list_head構造体のアドレスを適切なアドレスに変換する 詳細 struct list_head構造体のポインタを引数として受け取り、受け取ったアドレスからRB_FLAG_MASKのbitを落として、正しいポインタを取得する これはポインタは下位4バイト境界でアライ…

リスト操作 - list_entry()

概要 アドレスから、そのアドレスが示す値が含まれる型の開始アドレスを取得する 詳細 container_of()のwrapperマクロ

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

概要 アドレスから、そのアドレスが示す値が含まれる型の開始アドレスを取得する 詳細 このマクロでは以下の引数を受け取る 対象の構造体へのポインタ : ptr 対象の構造体を含む構造体の型を示す : type 対象の構造体を含む構造体のうち、対象の構造体のメン…

バッファ操作 - __rb_page_index()

概要 バッファのデータを保持するアドレスを取得する 詳細 この関数ではstruct buffer_page構造体に含まれるstruct buffer_data_page構造体のpageメンバのdataメンバの指定したindexのアドレスを取得する struct buffer_data_page構造体のdataメンバはchar型…

ローカルオブジェクト - local_add_return()

概要 local_t型の値に任意の値を加算し、結果を取得する 詳細 _ASM_XADDで引数として受け取ったlocal_t型の値と任意の値を交換して加算するアセンブラ命令を実行する 任意の値は関数内のローカル変数に保持し、引数として受け取った任意の値は交換加算命令に…

アセンブラ命令 - _ASM_XADD

asm

概要 CPUのアーキテクチャに応じた値を交換する加算命令を生成する 詳細 __ASM_SIZE()にxaddを渡して実行し、CPUのアーキテクチャに応じた値を交換する加算命令を生成する

ローカルオブジェクト - local_add()

概要 local_t型の値に任意の値を加算する 詳細 _ASM_ADDで引数として受け取ったlocal_t型の値と任意の値を加算するアセンブラ命令を実行する

アセンブラ命令 - _ASM_ADD

asm

概要 CPUのアーキテクチャに応じた加算命令を生成する 詳細 __ASM_SIZE()にaddを渡して実行し、CPUのアーキテクチャに応じたインクリメント命令を生成する

バッファ操作 - test_time_stamp()

概要 有効なタイムスタンプのデータを保持しているか確認する 詳細 タイムスタンプの差分を示す数値を受け取り、引数の値の27bit以降のbitが立っていた場合は1を、それ以外の場合は0を返す これはタイムスタンプの差分を示す数値は27bit以下のbitに保持され…

ALIGN()

概要 境界値を指定してアライメントを算出する 詳細 __ALIGN_KERNEL()のwrapperマクロ

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

概要 境界値を指定してアライメントを算出する 詳細 このマクロでは以下の引数を受け取る アライメントする数値を示す : x アライメントの境界値を示す : a __ALIGN_KERNEL_MASK()にxとaをxでキャストした値から1を引いた値を渡すことで、任意の値のアライメ…

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

概要 アライメントされた数値を算出する 詳細 このマクロでは以下の引数を受け取る アライメントする数値を示す : x アライメントのビットマスクを示す : mask xにmaskを加算した結果をmaskを反転した値で論理積を取ることでmaskで示すビットを0にクリアし、…

バッファ操作 - rb_start_commit()

概要 バッファの状態を書込み処理中に変更する 詳細 local_inc()でstruct ring_buffer_per_cpu構造体のcommittingメンバとcommitsメンバの値をインクリメントし、バッファの状態を書き込み中に変更する

CPU操作 - raw_cpu_read()

cpu

概要 指定されたシンボルの値を取得する 詳細 __pcpu_size_call_return()マクロを実行する この時マクロ内ではraw_cpu_read_x()が実行される

バッファ操作 - ring_buffer_normalize_time_stamp()

概要 与えられたタイムスタンプを元に戻す 詳細 タイムスタンプの値をDEBUG_SHIFT分右にシフトする これはrb_time_stamp()でタイムスタンプを取得時に左にシフトした値を元に戻す操作となる また、この関数はEXPORT_SYMBOL_GPL() によりモジュールからアクセ…

バッファ操作 - ring_buffer_time_stamp()

概要 struct ring_buffer構造体の状態に応じたタイムスタンプを取得する 詳細 preempt_disable_notrace()でプリエンプションを無効にした上で、rb_time_stamp()に引数で受け取ったstruct ring_buffer構造体へのポインタを渡して実行しタイムスタンプを取得す…

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

概要 context_tracking_enabledの値が有効であるか確認する 詳細 CONFIG_CONTEXT_TRACKINGが無効な場合は常に0を返すが、有効な場合はstatic_branch_unlikely()でcontext_tracking_enabledの値が0で無いことを確認する

ユーティリティー - context_tracking_enabled

概要 struct static_key_false型の変数 詳細 DEFINE_STATIC_KEY_FALSE()で定義されるstruct static_key_false型の変数で、EXPORT_SYMBOL_GPL()によりモジュールからアクセス可能なシンボルとなる

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

概要 任意のシンボル名でstruct static_key_false型の変数を初期化する 詳細 引数で受け取った値をシンボル名とするstruct static_key_false型の変数をSTATIC_KEY_FALSE_INITで0で初期化する

ユーティリティー - STATIC_KEY_FALSE_INIT

概要 struct static_key_false型の変数を0で初期化する 詳細 STATIC_KEY_INIT_FALSEでstruct static_key_false型の変数のkeyメンバを0で初期化する命令を生成する

ユーティリティー - STATIC_KEY_INIT_FALSE

概要 struct static_key型の変数を0で初期化する 詳細 ATOMIC_INIT()でstruct static_key型のメンバenabledを0で初期化するが、HAVE_JUMP_LABELが定義されている場合はstruct jump_entry型のメンバentriesをJUMP_TYPE_FALSEで初期化する命令を生成する

atomic命令 - ATOMIC_INIT()

概要 atomic_t型の変数を初期化する 詳細 _atomic_t型の変数を引数で受け取った任意の値で初期化する命令を生成する

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

概要 struct static_key型の値が0であるか確認する 詳細 比較する値xを引数として取得し、HAVE_JUMP_LABELの値によって処理が以下のように変わります 定義済み __builtin_types_compatible_p()でxの型を比較し、型がstruct static_key_trueと一致したらarch_…

最適化 - likely()

概要 値が0でないことを確認し、0以外の場合に最適化されたコードを生成する 詳細 比較する値xを引数として受け取り、CONFIG_TRACE_BRANCH_PROFILINGとDISABLE_BRANCH_PROFILING、__CHECKER__の値によって以下のように処理が異なる CONFIG_TRACE_BRANCH_PROF…

最適化 - unlikely()

概要 値が0であるか確認し、0の場合に最適化されたコードを生成する 詳細 比較する値xを引数として受け取り、CONFIG_TRACE_BRANCH_PROFILINGとDISABLE_BRANCH_PROFILING、__CHECKER__の値によって以下のように処理が異なる CONFIG_TRACE_BRANCH_PROFILINGが…

最適化 - __branch_check__()

概要 二つの値が一致するか比較する 詳細 likely_notrace()に比較対象の値が0以外かどうか確認し、比較した結果を返す また、このマクロ呼び出しの結果をftrace_likely_update()で統計情報(ヒット・ミスのカウンタ)を更新する このマクロはunlikely()でも呼…

文字列操作 - strncpy()

概要 文字列を指定した文字数分コピーする 詳細 この命令は主にdecl、lodsb、stosbの3つの命令からなる 初めに、文字数のカウンタをデクリメントし、カウンタが負数になった場合は処理を終える 次にlodsb命令で%esiレジスタに割り当てられたコピー元の文字列…

文字列操作 - strcpy()

概要 文字列をコピーする 詳細 この命令は主にlodsb、stosbの2つの命令からなる 初めに、lodsb命令で%esiレジスタに割り当てられたコピー元の文字列の先頭アドレスから1byteを%alレジスタにロードする その後、stosb命令で%alレジスタの値を%ediレジスタに割…

文字列操作 - strlen()

概要 文字列の文字数を取得する 詳細 アセンブラ命令のrepneとscasb命令を使用して文字列の長さを取得する それぞれのアセンブラ命令は以下の操作を行う repne : %ecxレジスタの値が0になるまで処理を繰り返す scasb : %alと%ediの値を比較し、%ediの値を次…

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

概要 可変長引数をリセットする 詳細 可変長引数を示すva_list型の変数にNULLを代入する