linuxのメモ

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

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

型 - typecheck()

概要 コンパイル時に値が指定された型と合致するか確認する 詳細 指定された型typeとtypeof()で得られる実際の型が等しいか確認するが、コンパイル時のみのチェックとなるため返り値は常に1となる

時間管理 - time_after()

概要 2つの引数で取得した時間を比較し、第一引数の時間が大きいか確認する 詳細 typecheck()マクロにより2つの引数の型がunsigned longであり確認し 第一引数が第二引数よりも大きければ1、それ以外の場合は0を返す

CPU操作 - rep_nop()

cpu

概要 CPUを休止する 詳細 拡張インラインアセンブラにより以下の命令を実行する rep; nop この命令はPAUSE命令として認識されるため、CPUを一時的に休止する また、volatile修飾子により最適化を抑止するためコンパイル時にコードが除去されることがない

CPU操作 - cpu_relax()

cpu

概要 CPUを休止する 詳細 rep_nop()を実行しCPUを休止する

時間管理 - jiffies_to_msecs()

概要 周波数の回数から時間(ミリ秒)を算出する 詳細 周波数の回数を表す符号なし整数jを引数として取得し、以下の定数からミリ秒に変換する HZ : _CONFIG_HZによって指定されるCPUの周波数を示す定数 MSEC_PER_SEC : 1秒 = 1000ミリ秒のため1000を示す定数 B…

時間管理 - _msecs_to_jiffies()

概要 指定された時間(ミリ秒)に必要な周波数を算出する 詳細 ミリ秒を表す符号なし整数mを引数として取得し、以下の定数から周波数の回数に変換する HZ : _CONFIG_HZによって指定されるCPUの周波数を示す定数 MSEC_PER_SEC : 1秒 = 1000ミリ秒のため1000を示…

時間管理 - __msecs_to_jiffies()

概要 指定された時間(ミリ秒)に必要な周波数を算出する 詳細 引数として符号なし整数値(unsigned int)を与えられるが、この値を符号付き整数値(int)にキャストした際に負数となる場合はMAX_JIFFY_OFFSET_を返す それ以外の場合は_msecs_to_jiffies()から取得…

時間管理 - msecs_to_jiffies()

概要 指定された時間(ミリ秒)に必要な周波数を算出する 詳細 引数として符号なし整数値(unsigned int)を与えられる 引数の値が定数の場合 引数の値を符号付き整数値(int)にキャストした際に負数となる場合はMAX_JIFFY_OFFSETを返す 符号付き整数にキャストし…

エラー出力 - error_putstr()

概要 エラーメッセージの出力に使用する 詳細 __putstr()マクロのwrapper

エラー出力 - error()

概要 エラーメッセージを表示してシステムを停止する 詳細 error_putstr()を実行して以下の文字列を出力した後、アセンブラのhlt命令によりシステムを停止する [message] -- System halted

エラー出力 - __compiletime_error()

概要 エラーメッセージを出力してシステムを停止する 詳細 引数として受け取ったメッセージをerror()に渡して実行するが、gccのバージョンが4.3以上の場合だけ機能するので、それ以下のバージョンやgcc以外のコンパイラを使用している場合は何もしない。 関…

エラー出力 - __x_wrong_size()

概要 エラーメッセージを出力してシステムを停止する 詳細 以下のいづれかの関数を表し、__compiletime_error()にBad argument size for _x_の文字列を引数として実行し、システムを停止する __xchg_wrong_size() __cmpxchg_wrong_size() __xadd_wrong_size()…

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()マクロで読み込む

バッファ操作 - ring_buffer_record_off()

概要 ring_buffer構造体のオブジェクトを無効にする 詳細 ring_buffer構造体のポインタを引数として受け取り、ring_buffer構造体のrecord_disabledメンバにRB_BUFFER_OFFフラグをセットする record_disabledメンバはatomic_t型の変数として宣言されているた…

トレース - disable_trace_on_warning()

概要 warning error時にtraceを無効にする 詳細 __disable_trace_on_warningがtrueのときにtracing_off()を実行しtraceを無効にする

トレース - tracing_off()

概要 traceを無効にする 詳細 CONFIG_TRACINGが有効な場合にtracer_tracing_off()をglobal_traceのポインタを引数として実行する 無効な場合は何もしない

トレース - tracer_tracing_off()

概要 traceを無効にする 詳細 trace_array構造体のポインタを引数として受け取り、trace_array構造体内のtrace_buffer構造体のメンバであるbufferに有効なポインタが設定されていた場合はring_buffer_record_off()を実行する。 その後、trace_array構造体のb…

メモリバリア - smp_wmb()

概要 変更したメモリの内容が全てのCPUで同期されることを保証する 詳細 CONFIG_SMPが有効な場合は__smp_wmb()マクロを実行するがx86では__smp_wmb()もbarrier()と定義されているため、コンフィギュレーションに関係なくbarrier()のwrapperとなっている

メモリバリア - barrier()

概要 メモリの内容が確実に同期されることを保証する 詳細 gccでコンパイルする場合はlinux/compiler-gcc.hに定義されている __asm__ __volatile__("": : :"memory") が実行されると思いがちだが、IntelのCPUの場合はlinux/compiler-intel.hに定義されている…

メモリ割り当て - kmalloc_slab()

概要 パラメータのサイズに応じた大きさのkmem_cache構造体を返す 詳細 メモリの割当要求サイズ(size)に応じて以下のとおりに処理内容が変わる size == 0 ZERO_SIZE_PTRを返す 0 < size <= KMALLOC_MAX_SIZE size <= 192 sizeを元にsize_index配列から適切な…

エラー出力 - warn_slowpath_null()

概要 ワーニングエラーを出力する 詳細 ファイル名と行数を引数として受け取り、warn_slowpath_common()を実行する。 warn_slowpath_common()の引数として以下の値を渡す。 取得したファイル名 取得した行数 呼び出し元のアドレス TAINT_WARN NULL

エラー出力 - WARN_ON()

概要 conditionがtrueの場合にwarningエラーを出力する 詳細 CONFIG_BUGの設定で挙動が変わる 無効な場合はエラー出力を行わない 有効な場合は__WARN()を実行する

エラー出力 - __WARN()

概要 ワーニングエラーを出力する 詳細 __WARN_TAINTが定義されている場合__WARN_TAINT()_マクロを実行するが、 x86では定義されていないため__FILE__・__LINE__を引数としてwarn_slowpath_null()関数を実行する