linuxのメモ

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

2016-03-31から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を返…