linuxのメモ

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

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

割込み処理 - raw_local_irq_save()

irq

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

割込み処理 - arch_local_irq_save()

irq

概要 フラグレジスタの値を取得し、割込みを無効化する 詳細 arch_local_save_flags()によりフラグレジスタの値を取得し、arch_local_irq_disable()により割込みを無効化する

最適化 - likely_notrace()

概要 引数の値が期待値と一致するか確認する 詳細 __builtin_expect()*1_の第一引数に受け取った引数に!を二回つけることで0の場合は0、それ以外の場合は1を渡し、第二引数に1を渡すことで受け取った引数の値が0で無いことを確認する 尚、このコードは値が0…

CPU操作 - per_cpu()

cpu

概要 指定したCPU個別の値を取得する 詳細 per_cpu_ptr()で指定したCPU個別の値を保持するアドレスを取得し、そのアドレスに保存されている値を返す

CPU操作 - per_cpu_ptr()

cpu

概要 指定したCPU個別の値を保持するアドレス取得する 詳細 以下の引数を取得する CPU個別の値を示すポインタ : ptr CPU番号を示す : cpu CONFIG_SMPの値によって以下のように処理が異なる 有効 __verify_pcpu_ptr()でptrの値が有効なアドレスか確認し、SHIF…

CPU操作 - VERIFY_PERCPU_PTR()

cpu

概要 受け取ったアドレスが有効な値か確認する 詳細 __verify_pcpu_ptr()で引数の値が有効なアドレスか確認し、カーネルアドレス空間からアクセス可能なポインタに変換する

per_cpu_offset()

cpu

概要 CPU個別の値を保持する領域へのオフセットを取得する 詳細 __per_cpu_offsetから、指定したCPU番号のメンバの値を取得することでCPU個別の値を保持する領域へのオフセットを取得する

CPU操作 - __per_cpu_offset

cpu

概要 CPU個別の値を保持する領域のオフセットを保持する変数 詳細 コンパイル時にはBOOT_PERCPU_OFFSETで初期化され、EXPORT_SYMBOL()によりmoduleからもアクセス可能な値となる この値はsetup_per_cpu_areas()により実行時に適切な値で初期化される

モジュール - EXPORT_SYMBOL()

概要 moduleからアクセス可能なシンボルを生成する 詳細 カーネルとしてコンパイルされており、かつCONFIG_MODULESが有効な場合は__EXPORT_SYMBOL()を実行するが、それ以外の場合は何もしない

モジュール - __EXPORT_SYMBOL()

概要 moduleからアクセス可能なシンボルを生成する 詳細 以下の通りに適切なセクションに適切な値を保存し、モジュールから宣言したシンボルにアクセスできるようにする __CRC_SYMBOL()でmoduleのチェックサムを算出するための値を保存する __ksymtab_string…

vmlinux - VMLINUX_SYMBOL_STR()

概要 vmlinuxに出力するシンボル名の文字列を生成する 詳細 __VMLINUX_SYMBOL_STR()のwrapperマクロ

vmlinux - __VMLINUX_SYMBOL_STR()

概要 vmlinuxに出力するシンボル名の文字列を生成する 詳細 CONFIG_HAVE_UNDERSCORE_SYMBOL_PREFIXが有効な場合は引数の文字列の前に_(アンダースコア)を付加した文字列を、無効な場合は引数の文字列を生成する

モジュール - __CRC_SYMBOL()

概要 moduleのバージョン確認に使用するチェックサム計算するための値を保持する 詳細 このマクロでは以下の引数を取得する セクション名を示す文字列 : sec 対応するシンボル名を示す文字列 : sym CONFIG_MODVERSIONSが無効な場合は何も行わないが、有効な…

CPU操作 - SHIFT_PERCPU_PTR()

cpu

概要 CPU固有のデータを保持するアドレスを取得する 詳細 RELOC_HIDE()でCPU固有のデータを保持するアドレスを取得するが、__force_属性を付加することで異なるアドレス空間(percpuとkernel)でのメモリのアクセスを強制する

CPU操作 - RELOC_HIDE()

cpu

概要 CPU個別のデータを保持するアドレスを取得する 詳細 以下の場合で処理が異なる(優先度は上から順) intelのコンパイラを使用している場合 gccのコンパイラを使用している場合 上記以外 intelのコンパイラを使用している場合と処理内容は同じ x86のCPUはi…

CPU操作 - __verify_pcpu_ptr()

cpu

概要 受け取ったアドレスが有効な値か確認する 詳細 受け取った値に0を足すことで配列を指すポインタを受け取った場合もポインタとして認識することを強制し、typeof()で値の種別を確認することで有効な値が保持されているアドレスであることを確認すること…

CPU操作 - raw_smp_processor_id()

cpu

概要 現在実行中のCPU番号を取得する 詳細 this_cpu_read()にcpu_number()を渡して実行し、現在実行中のCPU番号を取得する

CPU操作 - cpu_number

cpu

概要 CPU番号 詳細 DECLARE_PER_CPU_READ_MOSTLY()で宣言されるint型のCPU個別の変数で、CPU番号を保持する変数

CPU操作 - DECLARE_PER_CPU_READ_MOSTLY()

cpu

概要 読込みに特化したCPU個別の変数を宣言する 詳細 DECLARE_PER_CPU_SECTION()に"..read_mostly"のセクション名を指定して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_"でサイ…

バッファ操作 - ring_buffer_record_on()

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

トレース - tracer_tracing_on()

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

トレース - tracing_on()

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

トレース - tracing_is_enabled()

概要 traceが有効か確認する 詳細 smp_rmb()を実行し、すべてのCPUでメモリを同期しglobal_trace変数のbuffer_disabledメンバが有効な値の場合に0を、それ以外の場合に1を返す global_trace変数のbuffer_disabledメンバはtracing_off()で無効にされる

atomic操作 - atomic_dec()

概要 指定された値をatomicにデクリメントする 詳細 引数として受け取ったatomic_t型のポインタのcounterの値をアセンブラのdecl命令でデクリメントする decl命令の直前にLOCK_PREFIXを実行する この値はCONFIG_SMPが有効な場合は"\n\tlock; "となりメモリを…

atomic操作 - atomic_inc()

概要 指定された値をatomicにインクリメントする 詳細 引数として受け取ったatomic_t型のポインタのcounterの値をアセンブラのincl命令でインクリメントする incl命令の直前にLOCK_PREFIXを実行する この値はCONFIG_SMPが有効な場合は"\n\tlock; "となりメモ…

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

概要 実行待ちプロセスが存在するか確認する 詳細 CONFIG_PREEMPT_TRACER の値によって以下のように処理が異なる 有効 trace_typeの値にTRACER_PREEMPT_OFFのbitが立っており、かつpreempt_count() を実行し実行待ちプロセス数を確認し、実行待ちプロセス数…

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

概要 実行待ちのプロセス数を取得する 詳細 CPU毎の実行待ちプロセス数を表す__preempt_countの値をraw_cpu_read_4()で取得し、PREEMPT_NEED_RESCHEDのbitを反転した値を返す