linuxのメモ

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

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

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

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

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

bit操作 - set_bit()

bit

概要 ビットマップの任意のビットをセットする 詳細 この関数では以下の引数を受け取る ビット番号を示す : nr ビットマップを保持する変数へのポインタ : addr IS_IMMEDIATE()にnrを引数として実行し、nrが定数であるか確認する 定数の場合 CONST_MASK_ADDR…

bit操作 - CONST_MASK()

bit

概要 1バイト分のビットマスクを生成する 詳細 このマクロでは以下の引数を受け取る ビット番号を示す : nr nrと7の論理積を取ることでnrの下位3ビットの値を取得し、取得した値分1を左にシフトすることでnrが示す下位1バイトのビットマスクを生成する

bit操作 - CONST_MASK_ADDR()

bit

概要 ビットマップ内の対象ビットが含まれるメモリアドレスを引数とする拡張インラインアセンブラ命令を生成する 詳細 このマクロでは以下の引数を受け取る ビット番号を示す : nr ビットマップを保持する変数へのポインタ : addr BITOP_ADDR()にaddrが示す…

bit操作 - BITOP_ADDR()

bit

概要 拡張インラインアセンブラ命令の引数を指定する命令を生成する 詳細 引数として受け取った値をvolatile long型のポインタとしてキャストし、ポインタの値を拡張インラインアセンブラの引数として指定する命令を生成するが、GCCのバージョンによってメモ…

bit操作 - IS_IMMEDIATE()

bit

概要 取得した値が定数であるか確認する 詳細 コンパイラの標準関数である__builtin_constant_p()で取得した値が定数であるか確認する

ログ出力 - debug_locks_off()

log

概要 ログ出力のロックを解除し、ログレベルを最大値に設定する 詳細 __debug_locks_off()でロックを解除し、debug_locks_silentの値を確認する ロックが解除済みだった場合、もしくはdebug_locks_silentに有効な値が入っていなければ0を返して終了する それ…

ログ出力 - console_verbose()

log

概要 ログ出力レベルを最大値に設定する 詳細 console_loglevelの値がCONSOLE_LOGLEVEL_SILENTでなければ、console_loglevelの値をCONSOLE_LOGLEVEL_MOTORMOUTHに設定する

ログ出力 - console_printk

log

概要 ログの出力レベルを保持する変数 詳細 要素数が4つのint型の配列で、それぞれの要素が特定のログレベルを保持する 0 : console_loglevelの値を保持し、CONSOLE_LOGLEVEL_DEFAULTで初期化される 1 : default_message_loglevelの値を保持し、MESSAGE_LOGL…

ログ出力 - debug_locks_silent

log

概要 ログ出力のロック状態を示す変数 詳細 初期化は行われず、EXPORT_SYMBOL_GPL()によりモジュールからアクセス可能な値となる

ログ出力 - __debug_locks_off()

log

概要 ログ出力のロック状態をoffにする 詳細 xchg()にdebug_locksと0を渡して実行することで、debug_locksに0を設定し、既存の値を返す

ログ出力 - debug_locks

log

概要 ログ出力のロック状態を示す変数 詳細 数値の1で初期化され、EXPORT_SYMBOL_GPL()によりモジュールからアクセス可能な値となる

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に操…

割込み処理 - irqs_disabled_flags()

irq

概要 引数で受け取った値の割込みフラグが立っているか確認する 詳細 raw_irqs_disabled_flags()のwrapperマクロ

割込み処理 - softirq_count()

irq

概要 ソフトウェア割込みで実行待ちになっているプロセス数を取得する 詳細 preempt_count()で実行待ちプロセス数を取得するが、SOFTIRQ_MASKでマスクをかけるためソフトウェア割込みだけのプロセス数を取得する

割込み処理 - raw_local_irq_restore()

irq

概要 引数の値をフラグレジスタに保存する 詳細 typecheck()により引数の値の型がunsigned longであることを確認し、 arch_local_irq_restore()を実行することでフラグレジスタの値を取得し、割込みを無効化する 取得した値を引数の変数に代入することでフラ…

フラグ操作 - arch_local_irq_restore()

概要 引数の値をフラグレジスタに保存する 詳細 CONFIG_PARAVIRTの値によって以下のように処理が異なる 有効 PVOP_CALLEE1()に返り値の型unsigned long、pv_irq_ops.save_fl*1と引数の値を渡して実行する 無効 native_save_fl()を実行する *1:この値は、カー…

準仮想化 - PVOP_CALL_ARGx()

概要 拡張インラインアセンブラで使用可能な引数を指定する命令を生成する 詳細 PVOP_CALL_ARG1、PVOP_CALL_ARG2、PVOP_CALL_ARG3、PVOP_CALL_ARG4のいずれかに該当し以下の処理を行う 引数の値をunsigned long型にキャストし、適切なレジスタに割り当てる拡…

割込み処理 - native_restore_fl()

irq

概要 任意の値をフラグレジスタに保存する 詳細 アセンブラ命令のpushで引数で取得した値をスタックに保存し、保存した値をpopf命令でフラグレジスタに読み込む

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

概要 指定した値とプリエンプションの値が等しいか確認する 詳細 preempt_count()で取得した実行待ちプロセス数とrcu_preempt_depth()で取得したRCUロックの深さの合計値が引数として取得した値と等しいか比較し、等しければ1を等しくなければ0を返す

RCU - rcu_preempt_depth()

rcu

概要 現在実行中のプロセスのRCUロックの深さを取得する 詳細 CONFIG_PREEMPT_RCUが無効な場合は常に0を返すが、有効な場合はcurrentで現在実行中のプロセス情報を取得し、struct task_struct構造体のrcu_read_lock_nestingメンバの値を返す

プロセス情報 - current

概要 現在実行中のプロセス情報を取得する 詳細 get_current()のwrapperマクロ

プロセス情報 - get_current()

概要 現在実行中のプロセス情報を取得する 詳細 this_cpu_read_stable()マクロでcurrent_taskによって示される現在実行中のプロセスを取得する

CPU操作 - this_cpu_read_stable()

cpu

概要 指定されたシンボルの値を取得する 詳細 percpu_stable_op()マクロに"mov"の文字列を引数として渡して実行する

CPU操作 - percpu_stable_op()

cpu

概要 CPU固有の指定した値を任意のアセンブラ命令で取得する 詳細 以下の引数を受け取る オペコード : op 入力値 : var 入力値を指定する際に__percpu_arg()マクロにP1を引数として渡して実行した結果を使用している P1を指定することによりアセンブラ命令実…

プロセス情報 - current_task

概要 CPU毎の現在実行中のプロセスを示す変数へのポインタ 詳細 DECLARE_PER_CPU()で宣言されるCPU個別のstruct task_struct構造体へのポインタ

プロセス情報 - is_idle_task()

概要 任意のプロセスがアイドルプロセスであるか確認する 詳細 取得したstruct task_struct構造体のpidメンバの値が0であるか確認する struct task_struct構造体のpidメンバはプロセスのpidを保持する変数で、アイドルプロセスはpidが0になる

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

概要 現在のタスクが他のプロセスに割り込んで実行されているかを確認する 詳細 preempt_count()で実行待ちプロセス数を取得し、この値が0の場合は0を0以外の値の場合は1を返す