linuxのメモ

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

cpu

CPU操作 - this_cpu_read()

cpu

概要 指定されたシンボルの値を取得する 詳細 __pcpu_size_call_return()マクロを実行する この時マクロ内ではthis_cpu_read_x()が実行される

CPU操作 - this_cpu_read_x()

cpu

概要 指定されたシンボルの値を取得する 詳細 以下のいずれかのマクロを表し、いずれの場合においてもpercpu_from_op()マクロに"mov"の文字列を引数として渡して実行する this_cpu_read_1() this_cpu_read_2() this_cpu_read_4() this_cpu_read_8()

CPU操作 - __pcpu_size_call_return()

cpu

概要 指定された命令を値のサイズに応じて実行し、実行結果を取得する 詳細 以下の引数を受け取る 実行する関数の種類を示す : stem 対象の値を示す : variable 値のサイズに応じて以下のように実行内容が変わる 1, 2, 4, 8biteの場合 stem が"func_"でサイ…

CPU操作 - raw_cpu_read_x()

cpu

概要 指定されたシンボルの値を取得する 詳細 以下のいずれかのマクロを表し、いずれの場合においてもpercpu_from_op()マクロに"mov"の文字列を引数として渡して実行する raw_cpu_read_1() raw_cpu_read_2() raw_cpu_read_4() raw_cpu_read_8()

CPU操作 - percpu_from_op()

cpu

概要 CPU固有の指定した値を任意のアセンブラ命令で取得する 詳細 以下の引数を受け取る オペコード : op 入力値 : var 入力値を指定する際に__percpu_arg()マクロに1を引数として渡して実行した結果を使用している また、opにはvarのサイズに応じてb, w, l,…

CPU操作 - DECLARE_PER_CPU()

cpu

概要 セクション名を指定せずにCPU個別の変数を宣言する 詳細 DECLARE_PER_CPU_SECTION()にセクション名を空文字で渡してCPU個別の変数を宣言する

CPU操作 - DECLARE_PER_CPU_SECTION()

cpu

概要 CPU個別の変数を宣言する 詳細 __PCPU_ATTRS()を使用してCPU個別のデータ領域にtype型のnameという名前の変数を宣言するが、ARCH_NEEDS_WEAK_PER_CPUが定義されている、もしくはCONFIG_DEBUG_FORCE_WEAK_PER_CPUが有効な場合はchar型の__pcpu_scope_[na…

CPU操作 - __PCPU_ATTRS()

cpu

概要 CPU個別のデータを定義する属性を生成する 詳細 以下のコードでCPU個別のデータを定義する属性を生成する __percpu __attribute__((section(PER_CPU_BASE_SECTION sec))) \ PER_CPU_ATTRIBUTES この時、__percpuとPER_CPU_ATTRIBUTESは空文字に変換され…

CPU操作 - __percpu_seg

cpu

概要 CPU固有の情報を保持するセグメントを表す文字列 詳細 _CONIG_X86_64が有効な場合はgs、無効な場合はfsとなる

CPU操作 - __percpu_prefix

cpu

概要 CPU固有のprefix示す文字列を出力する 詳細 CONFIG_SMPが無効な場合は空文字("")を出力するが有効な場合は以下のコードとなる "%%"__stringify(__percpu_seg)":" __stringify()に__percpu_segを渡して実行することで、CPU固有の情報を保持したセグメン…

CPU操作 - __percpu_arg()

cpu

概要 CPU固有の引数を示す文字列を出力する 詳細 __percpu_prefixと"%"を引数として受け取った文字列の前に付加する

CPU操作 - percpu_to_op()

cpu

概要 第一引数を出力、第二引数を入力として任意のアセンブラ命令を実行する 詳細 以下の引数を受け取る オペコード : op 出力値 : var 入力値 : val valのデータ型をvarのデータ型にキャストしアセンブラ命令を実行するが、出力値を指定する際に__percpu_ar…

CPU操作 - raw_cpu_write_x()

cpu

概要 指定されたシンボルに値を書き込む 詳細 以下のいずれかのマクロを表し、いずれの場合においてもpercpu_to_op()マクロに"mov"の文字列を引数として渡して実行する raw_cpu_write_1() raw_cpu_write_2() raw_cpu_write_4() raw_cpu_write_8()

CPU操作 - __pcpu_size_call()

cpu

概要 指定された命令を値のサイズに応じて実行する 詳細 以下の引数を受け取る 実行する関数の種類を示す : stem 対象の値を示す : variable 値のサイズに応じて以下のように実行内容が変わる 1, 2, 4, 8biteの場合 stem が"func_"でサイズが1の場合は以下の…

CPU操作 - raw_cpu_write()

cpu

概要 指定されたシンボルに値を書き込む 詳細 __pcpu_size_call()マクロを実行する この時マクロ内ではraw_cpu_write_x()が実行される

CPU操作 - rep_nop()

cpu

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

CPU操作 - cpu_relax()

cpu

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