linuxのメモ

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

cpu

CPU操作 - raw_cpu_read()

cpu

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

CPU操作 - this_cpu_read_stable()

cpu

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

CPU操作 - percpu_stable_op()

cpu

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

CPU操作 - cpumask_test_cpu()

cpu

概要 CPUのビットマップから任意のCPU番号の状態を取得する 詳細 以下の引数を受け取る CPU番号を示す : cpu CPUのビットマップを保持するstruct cpumask型のポインタ : cpumask cpumask_check()でcpuの値がCPU数の範囲内であることを確認し、cpumask_bits()…

CPU操作 - cpumask_check()

cpu

概要 CPU番号がCPU数の範囲内であることを確認し、指定したCPU番号を返す 詳細 CONFIG_DEBUG_PER_CPU_MAPSが無効な場合は特に何も処理を行わないが、有効な場合はWARN_ON_ONCE()で引数で受け取ったCPU番号とnr_cpumask_bitsの値を比較し、CPU番号がCPU数の範…

CPU操作 - setup_nr_cpu_ids()

cpu

概要 CPU数を保持する変数を初期化する 詳細 CONFIG_SMPが無効な場合は何も行わないが、有効な場合はcpumask_bits()にcpu_possible_maskを渡すことで、実行可能なCPUのビットマップを取得し、その値とNR_CPUSをfind_last_bit()に渡すことでビットマップ内で…

CPU操作 - cpu_possible_mask

cpu

概要 実行可能なCPU番号のビットマップへのポインタ 詳細 __cpu_possible_maskへのポインタを返すマクロ

CPU操作 - __cpu_possible_mask

cpu

概要 実行可能なCPU番号に必要なビットマップを保持するstruct cpumask型の変数 詳細 CONFIG_INIT_ALL_POSSIBLEが無効な場合は初期化されない(つまり0になる)が、有効な場合はCPU_BITS_ALLで初期化されるstruct cpumask型の変数で、EXPORT_SYMBOL()によりモ…

CPU操作 - CPU_BITS_ALL

cpu

概要 実行可能なCPU番号に必要なビットマップを初期化するための配列を返す 詳細 BITS_TO_LONGS()でNR_CPUSで必要な配列数を算出し、最後の要素([配列数 - 1])にBITMAP_LAST_WORD_MASK()でNR_CPUSのビットマップを取得し、その値で初期化する ただし、NR_CPU…

CPU操作 - raw_cpu_add_x()

cpu

概要 指定されたシンボルの値に任意の値を加算する 詳細 以下のいずれかのマクロを表し、いずれの場合においてもpercpu_add_op()マクロに受け取ったシンボルへのポインタと、加算する値を引数として渡して実行する raw_cpu_add_1() raw_cpu_add_2() raw_cpu_…

CPU操作 - percpu_add_op()

cpu

概要 CPU固有の指定されたシンボルの値に任意の値を加算する 詳細 このマクロでは以下の引数を取得する 対象の値が保存されているポインタを示す : var 対象に加算する値を示す : val valの値によって実行されるアセンブラ命令の種類が以下のように変わりま…

CPU操作 - cpumask_equal()

cpu

概要 CPUのビットマップを比較する 詳細 この関数ではCPUのビットマップを示すstruct cpumask構造体へのポインタ2つ(比較元と比較先)を受け取る cpumask_bits()で受け取った2つの値のbits要素(配列)を取得し、この値とnr_cpumask_bitsをbitmap_equal()に渡し…

CPU操作 - nr_cpumask_bits

cpu

概要 CPUのビットマスクに必要なbit数を定義する定数 詳細 CONFIG_CPUMASK_OFFSTACKの値によって以下のように異なる 有効 nr_cpu_idsの値 無効 NR_CPUSが示すCPU数

CPU操作 - nr_cpu_ids

cpu

概要 CPU数を保持する変数 詳細 NR_CPUSを初期値として持つが、起動時にsetup_nr_cpu_ids()で適切な値で上書きされる また、EXPORT_SYMBOL()によりモジュールからもアクセス可能な値となる

CPU操作 - cpumask_bits()

cpu

概要 struct cpumask構造体のbits要素の値を返す 詳細 struct cpumask構造体へのポインタを引数として受け取り、bitsメンバの値を返す bitsメンバはDECLARE_BITMAP()にbitsとNR_CPUSを渡して宣言されるため、コンパイル時に実際の大きさが決定される

CPU操作 - cpumask_of()

cpu

概要 指定したCPUのマスクを表すstruct cpumask構造体のポインタを取得する 詳細 get_cpu_mask()のwrapperマクロ

CPU操作 - get_cpu_mask()

cpu

概要 指定したCPUのマスクを表すstruct cpumask構造体のポインタを取得する 詳細 CPU番号を示すcpuを引数として取得し、cpu_bit_bitmapから[1 + cpu][0]のアドレスを[cpu / BITS_PER_LONG]番目の要素とするアドレスをを取得し、to_cpumask()でstruct cpumask…

CPU操作 - cpu_bit_bitmap

cpu

概要 CPUのbitmapを保持する配列 詳細 [BITS_PER_LONG + 1] * [BITS_TO_LONGS()にNR_CPUSを渡して取得した数]の二次元配列として宣言され、MASK_DECLARE_8()で初期化する*1 尚、BITS_PER_LONGの値が32bitの場合は0 - 32、32bit以上(64bit)の場合は0 - 64の要…

CPU操作 - to_cpumask()

cpu

概要 unsigned longのビットマスクをstruct cpumask構造体へのポインタに変換する 詳細 三項演算子で取得したビットマップか、__check_is_bitmap()の値のいずれかをstruct cpumask構造体のポインタにキャストした値を返す __check_is_bitmap()は常にint型の…

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()により実行時に適切な値で初期化される

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固有の変数を宣言する