linuxのメモ

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

bit

bit操作 - set_bit()

bit

概要 ビットマップの任意のビットをセットする 詳細 この関数では以下の引数を受け取る ビット番号を示す : nr ビットマップを保持する変数へのポインタ : addr IS_IMMEDIATE()にnrを引数として実行し、nrが定数であるか確認する 定数の場合 CONST_MASK_ADDR…

bit操作 - CONST_MASK()

bit

概要 1バイト分のビットマスクを生成する 詳細 このマクロでは以下の引数を受け取る ビット番号を示す : nr nrと7の論理積を取ることでnrの下位3ビットの値を取得し、取得した値分1を左にシフトすることでnrが示す下位1バイトのビットマスクを生成する

bit操作 - CONST_MASK_ADDR()

bit

概要 ビットマップ内の対象ビットが含まれるメモリアドレスを引数とする拡張インラインアセンブラ命令を生成する 詳細 このマクロでは以下の引数を受け取る ビット番号を示す : nr ビットマップを保持する変数へのポインタ : addr BITOP_ADDR()にaddrが示す…

bit操作 - BITOP_ADDR()

bit

概要 拡張インラインアセンブラ命令の引数を指定する命令を生成する 詳細 引数として受け取った値をvolatile long型のポインタとしてキャストし、ポインタの値を拡張インラインアセンブラの引数として指定する命令を生成するが、GCCのバージョンによってメモ…

bit操作 - IS_IMMEDIATE()

bit

概要 取得した値が定数であるか確認する 詳細 コンパイラの標準関数である__builtin_constant_p()で取得した値が定数であるか確認する

bit操作 - test_bit()

bit

概要 ビットマップから任意のビットの状態を取得する 詳細 以下の引数を受け取る ビット番号を示す : nr ビットマップを保持する配列 : addr __builtin_constant_p()でnrの値が定数かどうか確認し、定数の場合はconstant_test_bit()で、変数の場合はvariable…

bit操作 - variable_test_bit()

bit

概要 ビットマップから任意のビットの状態を取得する 詳細 以下の引数を受け取る ビット番号を示す : nr ビットマップを保持する配列 : addr 返り値の値は0で初期化されおり、返り値の値にaddrのビットマップからnr番目のビットの値を加算することで、ビット…

bit操作 - constant_test_bit()

bit

概要 ビットマップから任意のビットの状態を取得する 詳細 以下の引数を受け取る ビット番号を示す : nr ビットマップを保持する配列 : addr 以下の演算で算出する2つの値の論理積を取ることでaddrのビットマップからnr番目のビットの状態を取得する nrを[BI…

bit操作 - find_last_bit()

bit

概要 ビットマップ配列内でビットが1になっている最も大きな位置を取得する 詳細 この関数では以下の引数を取得する ビットマップの配列へのポインタ : addr ビットマップの大きさを示す : size 全ての配列の値と対応するビットマスクの論理積をとり、共通の…

bit操作 - __fls()

bit

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

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型の変数に収まらないため、ここで確認する値は受け取っ…

bit操作 - DECLARE_BITMAP()

bit

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

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型の配列の配列数を算出…