linuxのメモ

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

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

bit操作 - __fls()

bit

概要 任意の値のビットが1になっている最も大きな位置を取得する 詳細 アセンブラ命令のbsr命令で取得した値のビットが1になっている最も大きな位置を取得し、その値を返す

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…

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

概要 プリエンプションを有効にする 詳細 barrier()を実行するがCONFIG_PREEMPT_COUNTが有効な場合は__preempt_count_dec()で__preempt_countをインクリメントし、プリエンプションを有効にする この時、複数のプリエンプションが実行されている場合は__pree…

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

概要 実行待ちプロセスカウンターをデクリメントする 詳細 __preempt_count_sub()に1を渡して実行する

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

概要 実行待ちプロセスカウンターから任意の値を減算する 詳細 raw_cpu_add_4()で__preempt_countに引数で受け取った値のマイナス値を加算する

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

概要 プリエンプションを無効にする 詳細 barrier()を実行するがCONFIG_PREEMPT_COUNTが有効な場合は__preempt_count_inc()で__preempt_countをインクリメントし、プリエンプションを無効にする

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

概要 実行待ちプロセスカウンターをインクリメントする 詳細 __preempt_count_add()に1を渡して実行する

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

概要 実行待ちプロセスカウンターに任意の値を加算する 詳細 raw_cpu_add_4()で__preempt_countに引数で受け取った値を加算する

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()によりモジュールからもアクセス可能な値となる

bit操作 - bitmap_equal()

bit

概要 bit数を指定してビットマップを比較する 詳細 このマクロでは以下の引数を取得する 比較対象のビットマップへのポインタ : src1、src2 比較するビット数を示す : nbits small_const_nbits()でnbitsの値を確認した結果によって以下のように処理が異なる …

bit操作 - __bitmap_equal()

bit

概要 bit数を指定してビットマップを比較する 詳細 この関数では以下の引数を取得する 比較対象のビットマップへのポインタ : bitmap1、bitmap2 比較するビット数を示す : bits bitmap1とbitmap2は配列となっているため[要素数 - 1]回bitmap1とbitmap2の値を…

bit操作 - BITMAP_LAST_WORD_MASK()

bit

概要 指定したビット数分下位bitが1になる値を返す 詳細 取得した値の2の補数と[BITS_PER_LONG - 1]の論理積を求める この演算で取得した値の2の補数からBITS_PER_LONG以上のbitを全て落とす !0UL*1を上で求めた値分右にシフトする 結果として得られる値は引…

bit操作 - small_const_nbits()

bit

概要 値がBITS_PER_LONG以下の定数であることを確認する 詳細 引数で受け取った値が定数でかつBITS_PER_LONG以下の場合は1を、それ以外の場合は0を返す BITS_PER_LONG以上の大きさの値はunsigned long型の変数に収まらないため、ここで確認する値は受け取っ…

CPU操作 - cpumask_bits()

cpu

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

bit操作 - DECLARE_BITMAP()

bit

概要 変数名を指定して、任意のbit数を保存できる配列を宣言する 詳細 BITS_TO_LONGS()に任意のbit数を渡して取得した数分の要素数を持つunsigned long型の配列を宣言する

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…

モジュール - EXPORT_SYMBOL_GPL()

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

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の要…

bit操作 - MASK_DECLARE_X()

bit

概要 indexからbitマスクを取得可能な二次元配列を定義する 詳細 MASK_DECLARE_8、MASK_DECLARE_4、MASK_DECLARE_2、MASK_DECLARE_1のいずれかに該当し以下の処理を行う 引数の値をx、マクロ名のprefixをX、マクロをf()で表すとすると以下の再帰関数として定…

bit操作 - BITS_TO_LONGS()

bit

概要 bit値をlong型の変数の大きさに変換する 詳細 DIV_ROUND_UP()に引数の値とBITS_PER_BYTEにlongの大きさの積を引数として渡すことで、引数の値が示すbitをlongに変換した場合の大きさを取得する この値はビットマップで必要なlong型の配列の配列数を算出…

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

概要 小数点以下を切り上げる除算を行う 詳細 割られる数に対し(割る数 - 1)を加算し、その値を割る数で除算する このとき、割られる数が割りきれる数だった場合は加算する値は(割る数 - 1)であるため整数部分の値は同一値となるが、割り切れない数だった場…

CPU操作 - to_cpumask()

cpu

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

プロセス情報 - tsk_cpus_allowed()

概要 指定したプロセスの実行可能なCPUを示すデータを取得する 詳細 task_struct構造体のcpus_allowedメンバへのポインタを返す cpus_allowdは実行可能なCPUをbitで示すデータを保持する