linuxのメモ

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

atomic

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()を実…

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_の文字列の末尾に追加した文字列を生成する

atomic命令 - ATOMIC_INIT()

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

atomic命令 - xchg()

概要 2つの値を入れ替える 詳細 __xchg_op()に入れ替える2つの値へのポインタと実行命令としてxchgを引数として渡して2つの値を入れ替える 尚、xchg命令ではLOCKプリフィックスの有無に関わらずatomicに実行されるため、lockには空文字を渡す

atomic命令 - __xchg_op()

概要 2つの値を入れ替える 詳細 以下の値を引数として持つ 保存先の値へのポインタ : ptr 保存する値へのポインタ : arg 実行する命令の種類を示す : op この値にはxchgかxaddのいずれかの値をとり、xaddの場合はptrとargの合計値をptrに保存する atomicに操…

atomic操作 - atomic_dec()

概要 指定された値をatomicにデクリメントする 詳細 引数として受け取ったatomic_t型のポインタのcounterの値をアセンブラのdecl命令でデクリメントする decl命令の直前にLOCK_PREFIXを実行する この値はCONFIG_SMPが有効な場合は"\n\tlock; "となりメモリを…

atomic操作 - atomic_inc()

概要 指定された値をatomicにインクリメントする 詳細 引数として受け取ったatomic_t型のポインタのcounterの値をアセンブラのincl命令でインクリメントする incl命令の直前にLOCK_PREFIXを実行する この値はCONFIG_SMPが有効な場合は"\n\tlock; "となりメモ…

atomic操作 - ACCESS_ONCE()

概要 指定された値に確実にアクセスする 詳細 __ACCESS_ONCE()のwrapperマクロ

atomic操作 - __ACCESS_ONCE()

概要 指定された値に確実にアクセスする 詳細 volatile修飾子をつけることでコンパイラの最適化を抑止し、コードで指定した箇所で確実に値にアクセスすることを強制する

atomic操作 - __raw_cmpxchg()

概要 比較値が古い値と等しい場合に新しい値に書き換える 詳細 以下の値を引数として持つ 比較元の値のポインタ : ptr 元の値 : old 新しい値 : new 比較元の値の大きさを示す値 : size atomicに操作を行うか決める : lock 拡張インラインアセンブラにより以…

atomic操作 - __cmpxchg()

概要 比較値が古い値と等しい場合に指定されたサイズの新しい値に書き換える 詳細 受け取った引数にLOCK_PREFIXを追加して__raw_cmpxchg()を実行する LOCK_PREFIXにはCONFIG_SMPが有効な場合は"\n\tlock; "の文字列が入り、全てのCPUでこの操作に伴うメモリ…

atomic操作 - cmpxchg()

概要 比較値が古い値と等しい場合に比較値と同じサイズの新しい値に書き換える 詳細 受け取った引数に比較値のサイズを追加して__cmpxchg()を実行する

atomic操作 - atomic_cmpxchg()

概要 atomic_t型の変数の値が古い値と等しい場合に新しい値に書き換える 詳細 引数として受け取ったatomic_t型のポインタのcounterのポインタをcmpxchg()に渡して実行する

atomic操作 - __read_once_size

概要 指定された値を指定されたsizeでatomicに読み込む 詳細 __READ_ONCE_SIZEマクロを展開し実行する __READ_ONCE_SIZEマクロは以下の変数が宣言されている前提で実行する 値のsizeを示すsize 読込元の値のポインタを示すp 返り値のポインタを示すres また…

atmic操作 - __READ_ONCE

概要 指定された値をatomicに読み込む 詳細 checkの値に応じて__read_once_size_nocheck()と__read_once_size()を切り替えるがCONFIG_KASANが無効なときは両関数は同一である。 CONFIG_KASANが有効な場合は宣言が static __always_inline から static __no_s…

atomic操作 - READ_ONCE()

概要 指定された値をatomicに読み込む 詳細 __READ_ONCE()マクロで値のチェックを行うように指定し実行する

atomic操作 - atomic_read()

概要 atomic_t型の変数の値をatomicに読み込む 詳細 引数として受け取ったatomic_t型のポインタのcounterの値をREAD_ONCE()マクロで読み込む