linuxのメモ

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

2016-03-01から1ヶ月間の記事一覧

CPU操作 - cpumask_test_cpu()

cpu

概要 CPUのビットマップから任意のCPU番号の状態を取得する 詳細 以下の引数を受け取る CPU番号を示す : cpu CPUのビットマップを保持するstruct cpumask型のポインタ : cpumask cpumask_check()でcpuの値がCPU数の範囲内であることを確認し、cpumask_bits()…

bit操作 - test_bit()

bit

概要 ビットマップから任意のビットの状態を取得する 詳細 以下の引数を受け取る ビット番号を示す : nr ビットマップを保持する配列 : addr __builtin_constant_p()でnrの値が定数かどうか確認し、定数の場合はconstant_test_bit()で、変数の場合はvariable…

bit操作 - variable_test_bit()

bit

概要 ビットマップから任意のビットの状態を取得する 詳細 以下の引数を受け取る ビット番号を示す : nr ビットマップを保持する配列 : addr 返り値の値は0で初期化されおり、返り値の値にaddrのビットマップからnr番目のビットの値を加算することで、ビット…

bit操作 - constant_test_bit()

bit

概要 ビットマップから任意のビットの状態を取得する 詳細 以下の引数を受け取る ビット番号を示す : nr ビットマップを保持する配列 : addr 以下の演算で算出する2つの値の論理積を取ることでaddrのビットマップからnr番目のビットの状態を取得する nrを[BI…

CPU操作 - cpumask_check()

cpu

概要 CPU番号がCPU数の範囲内であることを確認し、指定したCPU番号を返す 詳細 CONFIG_DEBUG_PER_CPU_MAPSが無効な場合は特に何も処理を行わないが、有効な場合はWARN_ON_ONCE()で引数で受け取ったCPU番号とnr_cpumask_bitsの値を比較し、CPU番号がCPU数の範…

エラー出力 - __bad_percpu_size()

概要 実行時エラーを検出するためのシンボル 詳細 extern宣言されているが、実態がソースコードのどこにも定義されていないシンボル extern宣言されているためプリプロセッサでは正常に処理することができるが、実行時にこの処理を実行しようとするとエラー…

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

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

エラー出力 - ____wrong_branch_error()

概要 実行時エラーを検出するためのシンボル 詳細 extern宣言されているが、実態がソースコードのどこにも定義されていないシンボル extern宣言されているためプリプロセッサでは正常に処理することができるが、実行時にこの処理を実行しようとするとエラー…

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

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

自己修正コード - arch_static_branch_jump

概要 分岐可能なコードを生成し、条件を判断するコードを1を返すコードへのJMP命令で初期化する 詳細 asm_volatile_goto()で分岐可能なアセンブラ命令を生成する 0xe9で示されるJMP命令で初期化し、l_yesラベルへ分岐するため初期状態では常に1を返すことに…

自己修正コード - arch_static_branch()

概要 分岐可能なコードを生成し、条件を判断するコードをNOP命令で初期化する 詳細 asm_volatile_goto()で分岐可能なアセンブラ命令を生成する __stringify()にSTATIC_KEY_INIT_NOPを渡すことで5byteのNOP命令の文字列を生成するため、初期状態では常に0を返…

アセンブラ命令 - STATIC_KEY_INIT_NOP

asm

概要 5byteのNOP命令を示すバイトコード 詳細 CONFIG_X86_64の値が有効な場合はP6_NOP5_ATOMIC、無効な場合はGENERIC_NOP5_ATOMICで示される5byteのNOP命令に変換される

アセンブラ命令 - P6_NOPx

asm

概要 P6アーキテクチャのCPUで使用可能なNOP命令 詳細 各数値が実行命令のバイト数を表しており、以下の命令が使用できる P6_NOP1 P6_NOP2 P6_NOP3 P6_NOP4 P6_NOP5 P6_NOP6 P6_NOP7 P6_NOP8 P6_NOP5_ATOMIC それぞれの命令は以下に示すアセンブラ命令と同等…

アセンブラ命令 - K7_NOPx

asm

概要 K7アーキテクチャのCPUで使用可能なNOP命令 詳細 各数値が実行命令のバイト数を表しており、以下の命令が使用できる K7_NOP1 K7_NOP2 K7_NOP3 K7_NOP4 K7_NOP5 K7_NOP6 K7_NOP7 K7_NOP8 K7_NOP5_ATOMIC それぞれの命令は以下に示すアセンブラ命令と同等…

アセンブラ命令 - K8_NOPx

asm

概要 K8アーキテクチャのCPUで使用可能なNOP命令 詳細 各数値が実行命令のバイト数を表しており、以下の命令が使用できる K8_NOP1 K8_NOP2 K8_NOP3 K8_NOP4 K8_NOP5 K8_NOP6 K8_NOP7 K8_NOP8 K8_NOP5_ATOMIC それぞれの命令は以下に示すアセンブラ命令と同等…

アセンブラ命令 - GENERIC_NOPx

asm

概要 x86CPUで共通で使用可能なNOP命令 詳細 各数値が実行命令のバイト数を表しており、以下の命令が使用できる GENERIC_NOP1 GENERIC_NOP2 GENERIC_NOP3 GENERIC_NOP4 GENERIC_NOP5 GENERIC_NOP6 GENERIC_NOP7 GENERIC_NOP8 GENERIC_NOP5_ATOMIC それぞれの…

プリエンプション - preemptible()

概要 プリエンプション可能であることを確認する 詳細 CONFIG_PREEMPT_COUNTが無効な場合は常に0を返し、有効な場合はpreempt_count()で実行待ちプロセス数が0でかつ、irqs_disabled()で現在割込み処理中である場合に1を返す、それ以外の場合は0を返す

アセンブラ命令 - THUNK

asm

概要 任意のラベル名でデフォルト引数を持つ指定した関数を実行するコードを生成する 詳細 アセンブラのマクロとして定義され、以下の引数を受け取る ラベルの名前を示す : name 実行する関数へのポインタ : func 実行する関数に呼び出し元のアドレスが必要…

アセンブラ命令 - _ASM_NOKPROBE

asm

概要 kprobe_blacklistセクションに任意のデータを追加する 詳細 pushsectionセクションで_kprobe_blacklistに書込み可能なデータとして_ASM_ALIGNでアライメントされ、_ASM_PTRで受け取ったデータのアドレスを示すデータを追加する

プリエンプション - __preempt_count_dec_and_test()

概要 プロセス待ちカウンターの値をデクリメントし結果が0になったかどうか確認する 詳細 GEN_UNARY_RMWcc()に以下の引数を渡して実行する アセンブラ命令 : decl アセンブラ命令の実行対象の値 : __preempt_count アセンブラ命令の0番目のオペランド : __pe…

アセンブラ命令 - GEN_UNARY_RMWcc()

asm

概要 任意のアセンブラ命令を実行し、実行結果を返す 詳細 このマクロでは以下の引数を受け取る アセンブラ命令のニーモニックを示す文字列 : op アセンブラ命令の実行対象を示す変数へのポインタ : var アセンブラ命令の0番目のオペランドを示す文字列 : ar…

アセンブラ命令 - __GEN_RMWcc()

asm

概要 任意のアセンブラ命令を実行し、実行結果を返す 詳細 このマクロでは以下の引数を受け取る アセンブラ命令を示す文字列 : fullop アセンブラ命令の実行対象を示す変数へのポインタ : var 返り値の判断に使用するsuffix : cc CC_HAVE_ASM_GOTOが有効な場…

アセンブラ命令 - asm_volatile_goto()

asm

概要 インラインアセンブラ内でC言語内のラベルにgoto可能なコードを生成する 詳細 コンパイラがサポートしている場合は asm goto() で拡張インラインアセンブラのコードを展開し、コンパイラによりインラインアセンブラのコードからC言語のラベルにgoto可能…

トレース - is_graph()

概要 stract trace構造体のtrace_flagsメンバのフラグを確認する 詳細 CONFIG_FUNCTION_GRAPH_TRACERが無効な場合は常に0を返すが、有効な場合はstruct trace_array構造体のtrace_flagsメンバの値にTRACE_ITER_DISPLAY_GRAPH*1のbitが立っているかを確認する…

トレース - TRACE_FLAGS

概要 stract trace構造体のtrace_flagsで取り得る値を定義する 詳細 stract trace構造体のtrace_flagsで取り得る値とその名前を定義するためのマクロで、このマクロ内で使用されるC()はシンボル名と名前を引数として受け取りこのフラグセットを使用する箇所…

トレース - trace_iterator_bits

概要 struct trace構造体のtrace_flagsメンバが利用可能な値のビット番号を定義する 詳細 TRACE_FLAGSによりstruct trace構造体のtrace_flagsメンバで取り得る値のビット番号とその値を示す名前を定義する

トレース - trace_iterator_flags

概要 struct trace構造体のtrace_flagsメンバの値を定義する 詳細 TRACE_FLAGSによりstruct trace構造体のtrace_flagsメンバで取り得る値とその値を示す名前を定義する

フラグ操作 - local_save_flags()

概要 フラグレジスタの値を取得する 詳細 raw_local_save_flags()のwrapperマクロ

CPU操作 - setup_nr_cpu_ids()

cpu

概要 CPU数を保持する変数を初期化する 詳細 CONFIG_SMPが無効な場合は何も行わないが、有効な場合はcpumask_bits()にcpu_possible_maskを渡すことで、実行可能なCPUのビットマップを取得し、その値とNR_CPUSをfind_last_bit()に渡すことでビットマップ内で…

bit操作 - find_last_bit()

bit

概要 ビットマップ配列内でビットが1になっている最も大きな位置を取得する 詳細 この関数では以下の引数を取得する ビットマップの配列へのポインタ : addr ビットマップの大きさを示す : size 全ての配列の値と対応するビットマスクの論理積をとり、共通の…