linuxのメモ

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

utility

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

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

ユーティリティ - __same_type()

概要 2つの変数の型を比較する 詳細 __builtin_types_compatible_p()により、引数で受け取った2つの変数の型が一致するか比較する

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

概要 値の大きさがプリミティブ型と一致することを確認する 詳細 引数として受け取った値の大きさがchar型、short型、int型、long型のいずれかと一致することを確認し、プリミティブ型の大きさと一致することを確認する

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

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

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にクリアし、…

ユーティリティー - 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で初期化する命令を生成する

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

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

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

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

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

概要 可変長引数の開始アドレスを取得する 詳細 このマクロでは以下の引数を受け取る 可変長引数を保持するva_list型の変数 : ap 呼び出し元の関数で受け取る引数のうち、最後の引数を示す : A _bnd()でAを_AUPBNDでアライメントした値をAのアドレスに加算す…

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

概要 値をアライメントした際に必要なサイズを取得する 詳細 このマクロでは以下の引数を受け取る 対象の変数を示す : X アライメントする値を示す : bnd Xのサイズとbndの値を加算し、算出した値とbndを否定した値の論理積を取得することでXをbndでアライメ…

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

概要 struct static_key型とその類似の型の変数の値を取得する 詳細 __builtin_types_compatible_p()で引数として取得した値の型を比較し、以下の型のいずれとも一致しない場合は____wrong_branch_error()を実行し、いずれかと一致した場合はstatic_key_coun…

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

概要 struct static_key型の変数の値を読み込む 詳細 atomic_read()で引数として取得したstruct static_key型の変数のenabledメンバの値をatomicに読み込む

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

概要 小数点以下を切り上げる除算を行う 詳細 割られる数に対し(割る数 - 1)を加算し、その値を割る数で除算する このとき、割られる数が割りきれる数だった場合は加算する値は(割る数 - 1)であるため整数部分の値は同一値となるが、割り切れない数だった場…

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

概要 構造体に含まれるメンバのoffsetを取得する 詳細 __compiler_offsetof()が定義されている場合は__compiler_offsetof()を実行するが、未定義の場合は以下の処理で算出する 構造体をアドレス0から始まるポインタとして定義し、メンバ変数のアドレスを取得…

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

概要 構造体に含まれるメンバのoffsetを取得する 詳細 GCCのバージョンが4以上の場合に定義されるため、3以下の場合は未定義となる 定義される場合は__builtin_offsetof()のwrapperとなり、GCCに含まれる標準関数を実行する