linuxのメモ

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

2016-03-23から1日間の記事一覧

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)であるため整数部分の値は同一値となるが、割り切れない数だった場…