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

linuxのメモ

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

メモリ割り当て - __constant_c_memset()

概要 任意の大きさのメモリを初期化する 詳細 この関数では以下の引数を受け取る 初期化するメモリへのポインタ : s 初期化する値へのポインタ : c 初期化するメモリの大きさ : count 拡張インラインアセンブラで以下の処理を行う sをediレジスタに、cをeax…

メモリ割り当て - __constant_c_and_count_memset()

概要 任意の大きさのメモリを初期化する 詳細 この関数では以下の引数を受け取る 初期化するメモリへのポインタ : s 初期化する値へのポインタ : pattern 初期化するメモリの大きさ : count countの値が0 - 4の場合は、sのアドレスの値をpatternの値でcount…

メモリ割り当て - __memset()

概要 任意の大きさのメモリを初期化する 詳細 このマクロでは以下の引数を受け取る 初期化するメモリのアドレスを示す : s(rdiレジスタ) 初期化する値のアドレスを示す : c(rsiレジスタ) 初期化するメモリの大きさを示す : count(rdxレジスタ) レジスタへの…

メモリ割り当て - __constant_count_memset()

概要 任意の大きさのメモリを初期化する 詳細 __memset_generic()のwrapperマクロ

メモリ割り当て - __memset_generic()

概要 任意の大きさのメモリを初期化する 詳細 この関数では以下の引数を受け取る 初期化するメモリのアドレスを示す : s 初期化する値のアドレスを示す : c 初期化するメモリの大きさを示す : count 拡張インラインアセンブラにより引数を以下のようにレジス…

メモリ割り当て - memset_erms()

概要 rdiレジスタの指すアドレスからrdxレジスタの値分のメモリを初期化する 詳細 最初に以下の操作を行い処理の準備を行う rdiレジスタに格納されている保存先のアドレスをr9レジスタに退避 対象の文字列へのアドレスが保持されているsilレジスタ(rsiレジス…

メモリ割り当て - memset_orig()

概要 rdiレジスタの指すアドレスからrdxレジスタの値分のメモリを初期化する 詳細 1: ecxレジスタにsilレジスタの値を、raxレジスタに0x0101010101010101とsilレジスタの値の積をそれぞれ保存し、rdiレジスタの下位3bitが0でなければ以下の処理を行う rdxレ…

エラー出力 - BUILD_BUG_ON()

概要 コンパイル時にエラーを出力する 詳細 __CHECKER__と__OPTIMIZE__の値によって以下のように処理が異なる __CHECKER__が有効 何もしない __OPTIMIZE__が有効 ((void)sizeof(char[1 - 2*!!(condition)]))のコードにより、conditionが0以外の場合にコンパ…

エラー出力 - BUILD_BUG_ON_MSG()

概要 コンパイル時に任意のメッセージでエラーを出力する 詳細 このマクロでは以下の引数を受け取る 状態を示す : cond 表示するメッセージを示す : msg __CHECKER__が有効な場合は何も実行しないが、無効な場合はcompiletime_assert()にcondの否定した値とm…

バッファ操作 - rb_event_set_padding()

概要 イベントのpaddingを初期化する 詳細 引数として受け取ったstruct ring_buffer_event構造体に以下のデータを保存しイベントのpaddingを初期化する type_lenメンバにRINGBUF_TYPE_PADDING time_deltaメンバに0

バッファ操作 - rb_handle_head_page()

概要 バッファのヘッダを更新する 詳細 この関数では以下の引数を受け取る CPUごとのバッファへのポインタ : cpu_buffer バッファの最後のページへのポインタ : tail_page バッファの次のページへのポインタ : next_page rb_head_page_set_update()にRB_PAGE…

エラー出力 - RB_WARN_ON()

概要 条件に一致した場合にwarningエラーを出力する 詳細 このマクロでは以下の引数を受け取る バッファを示す : b 比較する値や式を示す : cond unlikely()によりcondの比較結果が0である場合に高速に実行可能なコードを生成し、比較結果を一時変数に保持す…

ユーティリティ - __same_type()

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

バッファ操作 - rb_page_entries()

概要 バッファ内のエントリ数を取得する 詳細 struct buffer_pageのentriesメンバの値をlocal_read()で読み出し、RB_WRITE_MASKと論理積の結果を返すため、結果は下位20bitが有効な数値となる

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

概要 local_t型の変数の値を読み込む 詳細 local_t型の変数を引数として受け取り、atomic_long_read()でlong_t型のaメンバを渡して実行する

atomic操作 - atomic_long_read_acquire()

概要 atomic_long_t型の変数の値をatomicに読み込み、long型の値を返す 詳細 ATOMIC_LONG_READ_OP()に_acquireを渡して実行することで定義され、値の取得に使用される関数はatomic_read_acquire()となる

atomic操作 - atomic_read_acquire()

概要 atomic_t型の変数の値をatomicに読み込む 詳細 atomic_t型の変数を引数として受け取り、smp_load_acquire()に引数の値のcounterメンバを渡して実行する

atomic操作 - smp_load_acquire()

概要 指定された値をatomicに読み込む 詳細 CONFIG_SMPの値によって以下のように処理が異なる 有効 __smp_load_acquire()を実行する 無効 READ_ONCE()で値を取得するが、取得元の値がatomicに取得可能な値かcompiletime_assert_atomic_type()で確認し、その…

atomic操作 - __smp_load_acquire()

概要 指定された値をatomicに読み込む 詳細 READ_ONCE()で値を取得するが、取得元の値がatomicに取得可能な値かcompiletime_assert_atomic_type()で確認する その後 CONFIG_X86_PPRO_FENCEが定義されている場合は__smp_mb()を、未定義の場合はbarrier()を実…

エラー出力 - compiletime_assert_atomic_type()

概要 コンパイル時にエラーを表示するコードを挿入する 詳細 compiletime_assert()のconditionに__native_word()の値を、msgに"Need native word sized stores/loads for atomicity."の文字列を渡して実行することで、atomicに実行可能な型でない場合にエラ…

エラー出力 - compiletime_assert()

概要 コンパイル時にエラーを表示するコードを挿入する 詳細 _compiletime_assert()のprefixに__compiletime_assert__を、suffixにコードの行番号を指定して実行する

エラー出力 - __compiletime_assert()

概要 コンパイル時にエラーを表示するコードを挿入する 詳細 このマクロでは引数として以下の値を受け取る 実行時の状態を示す : condition エラーメッセージを示す : msg 実行する関数名のprefixを示す : prefix 実行する関数名のsuffixを示す : suffix pre…

エラー出力 - __compiletime_error_fallback()

概要 コンパイル時にエラーを検知する 詳細 __CHECKER__が無効な場合は何も実行しないが、有効でかつ引数の値が1の場合はコンパイル時にエラーとなる これは char[1 - 2 * condition] 上記のコードでconditionの値が正の数の場合char型の配列数が負数となる…

エラー出力 - _compiletime_assert()

概要 コンパイル時にエラーを表示するコードを挿入する 詳細 __compiletime_assert()のwrapperマクロ

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

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

メモリバリア - __smp_mb()

概要 マルチプロセッサシステムで命令の実行順序の最適化を抑止する 詳細 mb()のwrapperマクロ

メモリバリア - mb()

概要 命令の実行順序がコード通りに実行されることを保証する 詳細 CONFIG_X86_32の値によって以下のように処理が異なる 有効 alternative()の置き換え元の命令にlock; addl $0,0(%%esp)を、置き換え後の命令にmfenceを、機能番号としてX86_FEATURE_XMM2を指…

自己修正コード - alternative()

概要 置換元の命令を任意の命令で置き換えるためにデータを初期化し、初期化完了後はいずれかの命令を実行する 詳細 alternative(小文字でマクロを指定した場合)はアセンブリ命令を実行するALTERNATIVEマクロのwrapperとなる ALTERNATIVEマクロ内では実行可…

atomic操作 - atomic_long_read()

概要 atomic_long_t型の変数の値をatomicに読み込み、long型の値を返す 詳細 ATOMIC_LONG_READ_OP()に引数を渡さないで実行することで定義され、値の取得に使用される関数はatomic_read()となる

atomic操作 - ATOMIC_LONG_READ_OP()

概要 atomic操作で任意の値をlong型の値として取得する関数を定義するマクロ 詳細 ATOMIC_LONG_PFX()に"t"の文字列を渡すことでatomic_t型の変数を初期化し、atomic_readと引数の値を連結した文字列で表される関数を実行し、実行結果をlong_型の値として返す…

atomic操作 - ATOMIC_LONG_PFX()

概要 アトミック操作で使用するprefixを追加した文字列を生成する 詳細 引数の値をatomic_の文字列の末尾に追加した文字列を生成する

バッファ操作 - rb_head_page_set_normal()

概要 フラグをRB_PAGE_NORMALに入れ替える 詳細 この関数では以下の引数を受け取る 比較対象のバッファへのポインタ : head 比較元のバッファへのポインタ : prev 変更前のフラグを示す : old_flag 受け取った引数にRB_PAGE_NORMALを加えてrb_head_page_set(…

バッファ操作 - rb_head_page_set_update()

概要 フラグをRB_PAGE_UPDATEに入れ替える 詳細 この関数では以下の引数を受け取る 比較対象のバッファへのポインタ : head 比較元のバッファへのポインタ : prev 変更前のフラグを示す : old_flag 受け取った引数にRB_PAGE_UPDATEを加えてrb_head_page_set(…

バッファ操作 - rb_head_page_set_head()

概要 フラグをRB_PAGE_HEADに入れ替える 詳細 この関数では以下の引数を受け取る 比較対象のバッファへのポインタ : head 比較元のバッファへのポインタ : prev 変更前のフラグを示す : old_flag 受け取った引数にRB_PAGE_HEADを加えてrb_head_page_set()を…

バッファ操作 - rb_head_page_set()

概要 バッファのフラグを入れ替える 詳細 この関数では以下の引数を受け取る struct buffer_page型のポインタ : head headの前のバッファを指すポインタ : prev 現在のフラグを示す : old_flag 新しいフラグを示す : new_flag cmpxchg()でheadのlistメンバと…

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

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

アセンブラ命令 - _ASM_SUB

asm

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

バッファ操作 - rb_is_head_page()

概要 バッファがHead Pageか確認する 詳細 この関数では以下の引数を取得する struct buffer_page構造体のポインタ : page struct list_head構造体のポインタ : list listのnextメンバの値をRB_FLAG_MASKを反転した値でマスクした値とpageのlistメンバの値が…

バッファ操作 - rb_is_reader_page()

概要 バッファがReader Pageか確認する 詳細 この関数ではstruct buffer_page構造体のポインタであるpageを引数として取得する pageのlistメンバからstruct list_head構造体のprevメンバのポインタを取得し、取得したポインタのnextメンバのアドレスとrb_lis…

バッファ操作 - rb_inc_page()

概要 バッファを次のバッファに入れ替える 詳細 この関数ではバッファの保持されているページを示すstruct buffer_page構造体のポインタへのポインタであるbpageを受け取る bpage内のstruct list_head構造体の要素であるlistメンバから次のリストへのポイン…

バッファ操作 - 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マクロ